中止嵌套的ajax调用/做promises改进了这段代码?

时间:2015-02-08 23:13:48

标签: jquery ajax promise

我有一个对象,它公开了一种异步获取某些数据的方法。该方法运行两个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();

如果在第一次回调成功后运行了中止方法,那么第二次回调将继续。

解决此问题的好方法是什么?我怀疑这是承诺擅长的东西,但我无法看到它们如何在这里使用。

1 个答案:

答案 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

这是有效的,因为您可以从承诺中返回承诺,这将使其等待内部承诺。