如何使用蓝鸟地图和返回对象

时间:2015-11-03 19:54:16

标签: javascript bluebird

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

目前,我正在使用它(但这是错误的):

{{1}}

原因很简单:我需要并发:3000,我需要返回对象。所以新的Promise是返回对象,而不是数组,而映射是因为并发。

还有蓝鸟的其他方法可以帮助我实现我的需求吗?我搜索了很多,但没有找到任何东西。

2 个答案:

答案 0 :(得分:2)

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

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

其中file1file2是文件的名称,result1result2file1和{{1}上的某些异步操作的结果那么你就可以这样做:

file2

这将使上面的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的最终解析值。

如果上面的第一个代码块不是您想要生成的“对象”类型,那么请进一步详细说明您想要的输出类型。

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

答案 1 :(得分:0)

我不认为Bluebird中有直接方法。但是你总是可以返回一个数组,然后你可以将它转换为对象。因此,你不需要蓝鸟来做它。 E. g。使用Lodash,您可以使用zipObject

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