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

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

$ .Deferred:如何檢測每個承諾何時執行

$ .Deferred:如何檢測每個承諾何時執行

蝴蝶不菲 2019-09-06 15:57:57
我有許多需要完成的異步任務,所以我使用的是promises。我需要檢測每個承諾何時被執行(解決和拒絕)。在此之前我不能繼續執行。我使用的是這樣的東西:$.when(promise1, promise2, ...).always();但是這個代碼是錯誤的,因為該when方法具有惰性求值,并且只要其中一個promise失敗就會返回。因此,always只要其中一個承諾失敗,回調也會運行。我想在編碼一個解決辦法,但這種使用情況是如此普遍,也許有人已經做它已經,或者也許甚至還有這樣做只使用jQuery的的一種方式(如果不是,這將是很好添加Promise.whenNonLazy或Promise.when(promise1, promise2, ..., false)在未來。這可能嗎?
查看完整描述

3 回答

?
函數式編程

TA貢獻1807條經驗 獲得超9個贊

更復雜的諾言庫有一個allSettled()類似的功能Q或Promise.settle類似藍鳥。


在jQuery中,您也可以自己實現這樣的函數并$使用它擴展命名空間,但只有在經常需要它并進行性能優化時才需要這樣做。


一個更簡單的解決方案是為你正在等待的每一個創建一個新的承諾,并且即使當底層的一個被拒絕時也要實現它們。然后你可以$.when()毫無問題地使用它們。簡而言之:


// using Underscore's .invoke() method:

$.when.apply(null, _.invoke(promises, "then", null, $.when)).done(…)

更穩定:


$.when.apply($, $.map(promises, function(p) {

    return p.then(null, function() {

        return $.Deferred().resolveWith(this, arguments);

    });

})).then(…);

您可以then稍微更改回調以區分最終的已完成和已拒絕的結果done。


查看完整回答
反對 回復 2019-09-06
?
千巷貓影

TA貢獻1829條經驗 獲得超7個贊

鐵匠鋪,


首先讓我們假設你的承諾是一個數組。


var promises = [....];

您似乎想要的是.when()應用于這些承諾的某些轉換,這樣任何被拒絕的承諾都會轉換為已解決,同時對已經解決的承諾透明。


所需的操作可以非常簡潔地寫成如下:


$.when.apply(null, $.map(promises, resolvize)).done(...);

//or, if further filtering by .then() is required ...

$.when.apply(null, $.map(promises, resolvize)).then(...);

resolvize轉換機制在哪里。


那應該resolvize()怎么樣?讓我們利用特征.then()來區分已解決和被拒絕的承諾,并做出相應的響應。


function resolvize(promise) {

    //Note: null allows a resolved promise to pass straight through unmolested;

    return promise.then(null, function() {

        return $.Deferred().resolve.apply(null, arguments).promise();

    });

}

未經測試


與resolvize在某些外部范圍,它可以被提供給被用在$.when.apply($.map(promises, resolvize))任何需要它的表達。這很可能是足夠的,沒有達到用新方法擴展jQuery的程度。


無論轉變如何實現,您最終都會遇到潛在的問題; 即知道.done()回調的每個參數,是否最初解決或拒絕其相應的承諾。這是您將拒絕轉換為解決方案所付出的代價。但是,您可以從原始承諾被解決/拒絕的參數中檢測原始狀態。


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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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