下面的函数首先进行同步比较test == 0
,如果通过则返回一些内容,如果不通过则进行异步请求。我的目的是让后者返回一些其他内容,例如“来自帖子回调的内容”,但我知道我做错了。不把Ajax请求改成同步的,可以吗?
var value = function (test) {
if (test == 0) {
return 'value is zero ';
} else {
return $.post('/echo/html/', {
html: 'false ',
delay: .5
}, function (r1) {
console.log('r1', r1);
return 'something from post callback';
})
.done(function (r2) {
console.log('r2', r2);
return 'something from done callback';
});
}
}(1);
console.log(value);
最佳答案
既然您已经从 ajax 调用中返回一个 promise ,那么从您的同步比较中,只需返回一个已解决的 promise 。然后,两个代码路径都返回使用终端值解析的 promise ,调用者可以使用相同的代码来处理结果,无论它在内部以何种方式工作。对于有时同步有时异步的代码,这是一种常见的设计模式。
var myFunc = function (test) {
if (test == 0) {
return $.Deferred().resolve('value is zero ');
} else {
return $.post('/echo/html/', {
html: 'false ',
delay: .5
}).then(function (r2) {
console.log('r2', r2);
// this will be the return value of the promise
return 'something from ajax finished';
});
}
};
myFunc(1).then(function(value) {
// value is here either way
});
仅供引用,在您的 $.post()
中同时使用成功处理程序函数和 .done()
处理程序是没有意义的。如果您要从函数返回一个 promise (这是我的建议),那么您应该只使用 promise 处理程序,而不是成功回调。
您可能还需要了解,从 ajax 调用的成功处理程序返回值没有任何用处。该返回值只是返回到 ajax 基础结构的异步内部,并且永远不会被任何东西使用。
关于javascript - 从异步或同步 JavaScript 请求返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29779492/