我需要使用map bluebird(Promise lib),但要返回一个对象,而不是一个数组。
目前,我正在使用它(但这是错误的):
{{1}}
原因很简单:我需要并发:3000,我需要返回对象。所以新的Promise是返回对象,而不是数组,而映射是因为并发。
还有蓝鸟的其他方法可以帮助我实现我的需求吗?我搜索了很多,但没有找到任何东西。
答案 0 :(得分:2)
如果您正在尝试生成以下形式的对象:
var result = {
file1: result1,
file2: result2
};
其中file1
和file2
是文件的名称,result1
和result2
是file1
和{{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 }