jQuery推迟:取消进度

有没有办法取消正在进行的延迟回调队列? 我有任意数量的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请求完成后如何执行函数?

先感谢您!

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

。然后()

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

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

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

抛出一个错误

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

可以故意throw('deliberate error') ,例如throw('deliberate error')

注意

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

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

通过阅读jQuery文档,似乎没有内置方法来执行您想要的操作。 有一个插件可以让你到达需要被称为jQuery-timing的地方 。 此线程也可能与您在jQuery中取消延迟的Promise有关 。