2015-06-01 88 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); 
}