2015-02-08 46 views
0

我有一个对象,它公开了一种异步获取某些数据的方法。该方法运行两个AJAX请求,但第二个请求依赖于第一个请求,因此需要等待第一个请求成功。中止嵌套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

相似的问题在这里(相同作者):http://stackoverflow.com/questions/28401679/rejecting-inner-promise-after-initial-promise-has-succeeded/28401933 – jfriend00 2015-02-09 02:58:54

+0

是啊,对不起,我只是没有'没有使用承诺,我认为这个例子更像是一个真实世界的例子,而不是这个人为的例子。 – 2015-02-09 03:44:21

回答

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 

这工作,因为你可以从一个承诺,这将导致它等待内承诺回报的承诺。

+1

我认为OP的问题主要是他们需要能够在任何时候中止操作。引用这个问题:***“但是,我确实需要能够中止请求”***这是如何提供的? – jfriend00 2015-02-08 23:53:08