使用蓝鸟Promises,我怎样才能嵌套每个?

时间:2015-02-18 15:22:24

标签: javascript asynchronous promise bluebird

我有2个数组,我想对它们的每个组合做一些事情。例如:

var array1, array2;

array1 = [1, 2, 3];

array2 = [4, 5, 5];

async.each(array1, function(val1, cb1) {
  return async.each(array2, function(val2, cb2) {
    return doProcessing(val1, val2, function(err) {
      return cb2(err);
    });
  }, function(err) {
    return cb(err);
  });
}, function(err) {
  return console.log('DONE');
});

我如何使用蓝鸟Promises做到这一点?

我在这里使用async模块,因为doProcessing是异步调用。

1 个答案:

答案 0 :(得分:3)

首先关于doProcessing宣传它:

process = Promise.promisify(doProcessing);

如果您已经包含了bluebird,那么在这种情况下使用回调是没有意义的。 现在它返回一个承诺,你可以轻松地使用它。至于问题的其他部分,你需要所有对 - 你可以将它重构为异步嵌套for循环:

return Promise.each(array1, function(val1){
     return Promise.each(array2, function(val2){
          return process(val1, val2);
     });
}).then(function(){
    // all done
});

请注意,如果数组只包含数字,则执行普通循环而不是承诺 - 如果值本身是从异步源获取的,则每个数组都很有用。

或者 - 这是一个更实用的方式与Ramda:

var all = Promise.all.bind(Promise);
var wait = R.compose(all, R.map(all), R.xprod);
wait(arr1, arr2).map(R.apply(process));