【问题标题】:Aborting nested ajax call / do promises improve this code?中止嵌套的 ajax 调用/promise 是否改进了这段代码?
【发布时间】:2015-02-09 07:33:32
【问题描述】:

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

如果在第一个回调成功后运行 abort 方法,则第二个回调将继续。

解决这个问题的好方法是什么?我暗自怀疑这是 promise 擅长的事情,但我无法看到它们在这里如何使用。

【问题讨论】:

  • 这里有类似的问题(同一作者):stackoverflow.com/questions/28401679/…
  • 是的,对不起,我只是没有使用 Promise,我认为这个例子比这个人为的例子更像是一个现实世界的例子。

标签: jquery ajax promise


【解决方案1】:

是的:

function foo (options) {
    return $.ajax({...}).then(function(result){
        return $.ajax({... }); // note the return
    });
}

这会让你做什么:

foo(...).then(function(result){
    // handle result
}); // can also add fail handler

这是可行的,因为您可以从一个承诺返回一个承诺,这将导致它等待内部承诺。

【讨论】:

  • 我认为 OP 问题的重点是他们需要能够在此期间随时中止操作。引用问题:“但是,我确实需要能够中止请求”。这是如何提供的?
猜你喜欢
  • 2015-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多