Promise.all安装在babel ES6的实现中

我使用babel来传递我的node.js@0.10.x代码,而且我被承诺所困。

我需要allSettled可以在qbluebirdallSettled使用的allSettledfunction。

在巴贝尔的核心js的Promise ,没有allSettled方法。

目前我使用q.allSettled作为解决方法:

import { allSettled } from 'q';

在babel polyfill中是否有这样的东西? 或者,这是一个很好的algorithm,我尝试实现?

或者,这是一个很好的algorithm,我尝试实现?

  1. 用执行器function创build一个新的承诺
  2. 在执行器的范围内使用一个计数器/结果数组
  3. 注册一个then()callback与每个父承诺保存结果在数组中
  4. 当计数器指示所有父承诺完成时,解决/拒绝来自步骤1的承诺

如果你看看q.allSettled的实现,你会发现实现起来非常简单。 以下是您可以使用ES6 Promise实现的方法:

 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); } 

这是我尝试类似的事情,我有时事通讯服务,在我的情况下,我希望我所有的安全承诺,所有的结果(拒绝和决议),所有的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; } 

这里是另一个相同的function: spex.batch

这里的源代码太多了,所以这里只是一个批处理如何使用它的例子:

 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: '!' } ] 

即整个arrays被解决,报告指数结果。

如果不是报告我们调用getErrors()的全部原因:

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

那么输出将是:

 REASON: [ 'World' ] 

这只是为了简化对发生错误列表的快速访问。