javascript - 使用bluebird Promises,我怎样才能做一个嵌套的each?

标签 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');
});

如何使用 bluebird Promise 做到这一点?

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

最佳答案

首先关于doProcessing promise 它:

process = Promise.promisify(doProcessing);

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

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

请注意,如果数组仅包含数字,则执行正常循环而不是 promise - 如果值本身是从异步源获取的,则每个数组在这里都很有用。

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

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

关于javascript - 使用bluebird Promises,我怎样才能做一个嵌套的each?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28587145/

相关文章:

javascript - WebView 不会触发 YouTube 中的导航事件

javascript - 如何让使用 JavaScript 制作的应用程序为其他 Apple 设备自动调整大小?

c# - 从 Windows 窗体异步执行存储过程然后断开连接?

swift 4 : Creating an asynchronous serial queue with 2 seconds wait after each job

promise 的 JavaScript 命名约定?

javascript - Selenium WebdriverJS Promise 循环

javascript - 用js添加重复的html并评估thymeleaf表达式

javascript - Promise 范围在执行时不同

javascript - 向 JS Promise 添加参数

javascript - 如何从数组中的今天日期获取过去六个月的时间并在 JavaScript 中返回该数组