10

Is there a way to cancel a deferred callback queue in progress? I have an arbitrary amount of ajax calls. I'd like to stop further ajax requests when data of success returns specific marker:

this.oDeferred=$.Deferred();
this.oChain=this.oDeferred;

for(var i=0; i<this.aKey.length; i++) {
    (function(iKey,self) {
        self.oChain=self.oChain.then(function(){
            return $.ajax({
                url:self.aUrl[iKey],
                type:'post',
                data:{'ajax':true},
                dataType:'json',
                success:function(data) {
                    if(data.bCancel==true) {
                        //stop deferred object here!
                    }
                }
            });
        })
    }(this.aKey[i],this))
}

this.oDeferred.done(function() {
    console.log('done')
});
this.oDeferred.resolve()

By the way - the function done() is fired autonomous after all ajax requests are made. How to execute a function after all ajax requests are done?

Thank you in advance!

4

2 回答 2

8

答案是肯定的。两种方法是可能的。

。然后()

.then()方法返回一个新的 Promise,其状态由传递给该方法的处理程序返回的内容决定。

  • 通过返回一个非 Promise 的值/对象,一个新的 Promise 会以与原始 Promise 相同的已解决/拒绝状态传递到方法链,但使用返回的值/对象解决/拒绝。
  • 通过返回一个 Promise,该 Promise 将沿方法链向下传递,其状态与原始 Promise 无关。

因此,延迟/承诺回调队列可以通过从.then()处理程序返回一个从未解决且从未拒绝的承诺来有效地取消。可以从.then()处理程序的完成处理程序(第一个参数)或其失败处理程序(第二个参数)中做出这样的承诺。.done()使用,.fail()或方法无法实现相同的效果.always(),它们无需修改即可返回原始的 Deferred/promise。

抛出错误

从 、 、 或 处理程序中抛出的未捕获错误.then().done()通过终止.fail()正在运行的事件线程来终止方法链。.always().progress()

例如,可以故意抛出错误throw('deliberate error')

笔记

应该注意的是,这两种方法都只会抑制链式方法处理程序(或通过赋值实现的等价物)。

无论采用哪种方法,在抑制返回/错误表达式执行时已经启动的任何异步进程都将继续,并且任何已经到位的相应完成/失败/始终/进度处理程序都可能触发。

于 2013-05-02T22:21:53.463 回答
0

通读 jQuery 文档,似乎没有内置的方法来做你想做的事。有一个插件可以让你到达你需要被称为jQuery-timing 的地方。该线程也可能与您在 jQuery 中取消延迟承诺有关

于 2013-05-02T13:40:07.660 回答