我有一个对象,它公开了一种异步获取某些数据的方法。该方法运行两个AJAX请求,但第二个请求依赖于第一个请求,因此需要等待第一个请求成功。
在对象之外,没有人需要知道发生了两个AJAX请求。但是,我确实需要能够中止请求。这导致我引入了竞争条件。
这里有一些伪代码:
function foo (options) {
var jqXHR = $.ajax({
success: function(){
console.log('jqXHR success');
var innerJqXHR = $.ajax({
success: options.success,
error: options.error
});
}
});
return jqXHR;
}
var jqXHR = foo({
success: function(){
console.log('innerJqXHR success');
}
});
// Abort, fails if jqXHR success has already been called.
jqXHR.abort();
如果在第一次回调成功后运行了中止方法,那么第二次回调将继续。
解决此问题的好方法是什么?我怀疑这是承诺擅长的东西,但我无法看到它们如何在这里使用。
答案 0 :(得分:0)
是:
function foo (options) {
return $.ajax({...}).then(function(result){
return $.ajax({... }); // note the return
});
}
可以让你这样做:
foo(...).then(function(result){
// handle result
}); // can also add fail handler
这是有效的,因为您可以从承诺中返回承诺,这将使其等待内部承诺。