Promise.all安装在babel ES6的实现中
我使用babel
来传递我的node.js@0.10.x
代码,而且我被承诺所困。
我需要allSettled
可以在q
和bluebird
或allSettled
使用的allSettled
function。
在巴贝尔的核心js的Promise
,没有allSettled
方法。
目前我使用q.allSettled
作为解决方法:
import { allSettled } from 'q';
在babel polyfill中是否有这样的东西? 或者,这是一个很好的algorithm,我尝试实现?
或者,这是一个很好的algorithm,我尝试实现?
- 用执行器function创build一个新的承诺
- 在执行器的范围内使用一个计数器/结果数组
- 注册一个then()callback与每个父承诺保存结果在数组中
- 当计数器指示所有父承诺完成时,解决/拒绝来自步骤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' ]
这只是为了简化对发生错误列表的快速访问。