jQuery延期:取消进度

时间:2013-05-02 10:21:44

标签: javascript jquery deferred

有没有办法取消正在进行的延迟回调队列? 我有一个任意数量的ajax调用。当成功数据返回特定标记时,我想停止进一步的ajax请求:

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()

顺便说一句,在完成所有ajax请求后,函数done()会自动触发。所有ajax请求完成后如何执行函数?

提前谢谢!

2 个答案:

答案 0 :(得分:8)

答案是肯定的。有两种方法可以实现。

。然后()

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

  • 通过返回一个非承诺的值/对象,新的承诺沿着方法链向下传递,其具有与原始承诺相同的已解决/拒绝状态,但使用返回的值/对象解析/拒绝。
  • 通过返回一个promise,该promise将传递给方法链,其状态独立于原始的promise。

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

抛出错误

来自.then().done().fail().always().progress()处理程序的未捕获错误将通过终止事件线程来终止方法链它正在运行。

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

注意

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

使用任何一种方法,任何已经在抑制返回/错误表达式执行时启动的异步进程都将继续,并且任何相应的done / fail / always / progress处理程序可能已经触发。

答案 1 :(得分:0)

通过jQuery文档阅读,似乎没有内置的方法来做你想要的。有一个插件可以让你到达需要被称为jQuery-timing的地方。此主题可能与您Canceling a Deferred Promise in jQuery有关。