如何使用蓝鸟地图和return对象

How to use bluebird map and return object

我需要使用 map bluebird(Promise 库)但是 return 一个对象,而不是一个数组。

目前我是这样用的(但是错了):

return new Promise(function(resolve, reject) {
  return Promise.map(files, function(file) {
      // LOGIC

      resolve({
        // object here
      })
  }, { concurrency: 3000 })
});

原因很简单:我需要并发:3000,我需要return这个对象。所以新的Promise是return对象,而不是数组,map是因为并发。

bluebird有没有其他方法可以帮助我实现我所需要的?我找了很多都没有找到。

我认为 Bluebird 中没有直接用于此的方法。但是你总是可以 return 一个数组,你可以稍后将它转换为对象。因此你不需要 Bluebird 来做它。例如使用 Lodash 你可以使用 zipObject:

_.zipObject([['fred', 30], ['barney', 40]]);
// → { 'fred': 30, 'barney': 40 }

如果您尝试生成以下形式的对象:

var result = {
    file1: result1,
    file2: result2
};

其中 file1file2 是文件名,result1result2 是对 file1file2,那么你可以这样做:

var result = {};
return Promise.map(files, function(file) {
    return doSomeAsync(file).then(function(data) {
        // add to our result object
        result[file] = data;
    });
}, {concurrency: 3000}).then(function() {
    // make the result obj be the final resolved value of Promise.map()
    return result;
});

这将使上面的 result 对象成为 Promise.map() promise 的最终解析值,该 promise return 从其中的函数编辑。

如果上面的第一个代码块不是您要生成的 "object" 类型,那么请进一步说明您想要的输出类型。


此外,您可能希望避免 promise anti-pattern 创建不必要的承诺,而不仅仅是链接或 return 您已经拥有的承诺。