亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

jQuery.when-何時不再延遲所有“未解決”(已解決或被拒絕)的回調?

jQuery.when-何時不再延遲所有“未解決”(已解決或被拒絕)的回調?

慕哥9229398 2019-10-18 13:47:54
當多個Deferred對象傳遞給jQuery.when時,該方法從新的“主” Deferred對象返回Promise,該對象跟蹤已傳遞的所有Deferred的聚合狀態。該方法將所有“遞延者”解決后,立即解析其主遞延者;或只要其中一個“延期者”被拒絕,就拒絕其主“延期者”。如果主Deferred已解析(即,所有Deferreds解析),則將傳遞給jQuery.when的所有Deferred的解析值傳遞給它。例如,當Deferreds是jQuery.ajax()請求時,參數將是請求的jqXHR對象,按照在參數列表中給出的順序:$.when( $.getJSON('foo'), $.getJSON('bar') ).done(function(foo, bar) {    // foo & bar are jqXHR objects for the requests});在多個Deferred的情況下,其中一個Deferred被拒絕,當立即解散其主Deferred的失敗回調時,jQuery。即使此時某些Deferred仍未解決:$.when( $.getJSON('foo'), $.getJSON('bar') ).fail(function(req) {    // req is the jqXHR object for one of the failed requests});當所有傳遞給jQuery的Deferred不再“未解決”(即全部“已解決”或“已拒絕”)時,我需要觸發回調。我可以發送具有200個OK代碼的JSON對象(而不是發送帶有404 Not Found錯誤狀態代碼的JSON),并在done()方法中確定成功/錯誤,但是我更喜歡保持API RESTful。我該怎么做?
查看完整描述

3 回答

?
RISEBY

TA貢獻1856條經驗 獲得超5個贊

我認為最簡單的方法是Deferred為每個AJAX請求保留一個輔助對象,并確保始終解決該問題:


var d1 = $.Deferred();

var d2 = $.Deferred();


var j1 = $.getJSON(...).complete(d1.resolve);

var j2 = $.getJSON(...).complete(d2.resolve);


$.when(j1, j2).done( only fires if j1 AND j2 are resolved );


$.when(d1, d2).done(function() {

     // will fire when j1 AND j2 are both resolved OR rejected

     // check j1.isResolved() and j2.isResolved() to find which failed

});

這是利用.complete()jQuery添加到AJAX 方法的Promise中的附加AJAX方法,該方法被同時用于已解決和已拒絕的Promise。


注意:d1.resolve本身可作為回調,它不需要包裝在一個function() { ... }塊中。


查看完整回答
反對 回復 2019-10-18
?
偶然的你

TA貢獻1841條經驗 獲得超3個贊

它幫助我消除了我創建的黑客程序,其中我在某種程度上人為地解決了諾言(無論潛在結果如何),以便我可以使用“何時”批處理多個請求并使用“完成”不管他們成功/失敗都繼續前進。


我正在“回答” Alnitak的答案,希望為他的建議提供另一種用途,該建議支持任意數量的潛在承諾。


var asyncFunc, entity, entities, $deferred, $deferreds;

// ...

foreach (entity in entities) {

    $deferred = $.Deferred();

    $deferreds.push($deferred);

    asyncFunc(entity).done(...).fail(...).always($deferred.resolve);

}

// ...

$.when.apply($, $deferreds).done(...)

這是偽JavaScript,但是應該傳達這種方法。對于某些任意大小的實體集,為每個實體創建一個遞延($ deferred)并將其推送到一個數組($ deferreds),進行異步調用,根據需要添加完成/失敗,但始終包含一個“始終”來解決此問題實體的延期付款。注意,“始終”接收延遲的解析功能而不是其調用。


'when'將$ deferreds數組轉換為'when'的參數列表,并且由于保證了這組deferreds的解析(感謝all),現在可以定義一個'done',它將被一次調用不管這些調用成功與否,異步調用都將完成。


查看完整回答
反對 回復 2019-10-18
  • 3 回答
  • 0 關注
  • 580 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號