2015-06-01 90 views
8

我使用babel來傳輸我的[email protected]代碼,並且我被承諾卡住了。Promise.all安裝在babel ES6中實現

我需要allSettled類型的功能,我可以用在qbluebirdangular.$q例如。

對於babel的核心-js Promise,沒有allSettled方法。

目前我使用q.allSettled作爲一種解決方法:

import { allSettled } from 'q';

是否有類似的東西在巴貝爾填充工具?或者,這對我來說是一個很好的算法來實現?

回答

1

另外,哪個是我嘗試實現的一個好算法?

  1. 創建具有executor function
  2. 新許使用計數器/結果陣列中的執行程序
  3. 的範圍與每個父承諾保存結果陣列
  4. 在寄存器A中,然後()回調
  5. 決心/拒絕從步驟1時的承諾計數器指示所有父承諾完成
+0

不錯,雖然現在我會堅持使用Q(這可能是相同的)。 – Zlatko

+0

關於你的第4步,我將如何以往任何時候都知道要拒絕新的承諾? –

+0

@torazaburo你是對的,你永遠不會拒絕,這是allSettled點:) 也許有些超時,但是這是一個不同的使用情況,而不是反映q.allSettled做什麼。 – Zlatko

1

這是我在嘗試類似的東西,我甲肝Ë通訊服務,並在我的情況,我想我allSettled承諾所有結果(拒絕和分辨率),的陣列來解決,爲了,一旦所有的email_promises結算(完所有的信件出去了):

Newsletter.prototype.allSettled = function(email_promises) { 
    var allSettledPromise = new Promise(function(resolve, reject) { 
     // Keep Count 
     var counter = email_promises.length; 

     // Keep Individual Results in Order 
     var settlements = []; 
     settlements[counter - 1] = undefined; 

     function checkResolve() { 
      counter--; 
      if (counter == 0) { 
       resolve(settlements); 
      } 
     } 

     function recordResolution(index, data) { 
      settlements[index] = { 
       success: true, 
       data: data 
      }; 
      checkResolve(); 
     } 

     function recordRejection(index, error) { 
      settlements[index] = { 
       success: false, 
       error: error 
      }; 
      checkResolve(); 
     } 

     // Attach to all promises in array 
     email_promises.forEach(function(email_promise, index) { 
      email_promise.then(recordResolution.bind(null, index)) 
       .catch(recordRejection.bind(null, index)); 
     }); 
    }); 
    return allSettledPromise; 
} 
0

這裏的另一種採取在相同的功能:spex.batch

source code將太多在這裏重新發布,所以這裏只是從如何使用它batch processing一個例子:

var spex = require('spex')(Promise); 

// function that returns a promise; 
function getWord() { 
    return Promise.resolve("World"); 
} 

// function that returns a value; 
function getExcl() { 
    return '!'; 
} 

// function that returns another function; 
function nested() { 
    return getExcl; 
} 

var values = [ 
    123, 
    "Hello", 
    getWord, 
    Promise.resolve(nested) 
]; 

spex.batch(values) 
    .then(function (data) { 
     console.log("DATA:", data); 
    }, function (reason) { 
     console.log("REASON:", reason); 
    }); 

此輸出:

DATA: [ 123, 'Hello', 'World', '!' ] 

現在,讓我們把它通過改變getWord這個失敗:

function getWord() { 
    return Promise.reject("World"); 
} 

現在輸出的是:

REASON: [ { success: true, result: 123 }, 
    { success: true, result: 'Hello' }, 
    { success: false, result: 'World' }, 
    { success: true, result: '!' } ] 

即整個陣列結算,報告指數結果。

,如果不是報告我們稱之爲getErrors()整個推理和:

console.log("REASON:", reason.getErrors()); 

那麼輸出將是:

REASON: [ 'World' ] 

這僅僅是爲了簡化快速訪問發生的錯誤列表。

12

如果你看看在implementation of q.allSettled你會看到它實際上是實現非常簡單。下面是你可以如何使用ES6 Promises實現它:

function allSettled(promises) { 
    let wrappedPromises = promises.map(p => Promise.resolve(p) 
     .then(
      val => ({ state: 'fulfilled', value: val }), 
      err => ({ state: 'rejected', reason: err }))); 
    return Promise.all(wrappedPromises); 
}