下面的函数首先执行同步比较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);
https://jsfiddle.net/o5kq8he6/2/ https://jsfiddle.net/o5kq8he6/2/
由于您已经从 ajax 调用返回一个承诺,因此从您的同步比较中,只需返回一个已解决的承诺。然后,两个代码路径都返回用最终值解析的承诺,并且调用者可以使用相同的代码来处理结果,无论其内部工作方式如何。这是代码的常见设计模式,有时是同步的,有时是异步的。
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()
处理程序。如果您要从函数返回承诺(这是我的建议),那么您应该仅使用承诺处理程序,而不是成功回调。
您可能还需要了解,从 ajax 调用的成功处理程序返回值没有任何用处。该返回值只是返回到 ajax 基础设施的异步内部,并且永远不会被任何东西使用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)