我有一个列表值
xs = [1, 2, 3, 4]
我还有一个异步函数square
,它返回传递给它的参数的平方的promise。我希望将我的列表元素并行传递给我的函数,然后将promises收集到一个数组中并等待它们全部完成。我可以将其表示为map / reduce操作。
Promise
.map(xs, function(x) {
return square(x)
}
)
.reduce(function(ys, y) {
return ys.concat(y)
}, [])
这最终会返回已解析的值
[1, 4, 9, 16]
够容易。现在说我想在答案数组中包含原始参数。
[{x:1, y:1}, {x:2, y:4}, {x:3, y:9}, {x:4, y:16}]
棘手的部分现在我有一个对象列表,每个对象在reduce步骤的开头都有一个隐藏在y
属性中的promise。如何编写Bluebird代码来执行此缩减步骤?
答案 0 :(得分:5)
你不会在reduce
步骤中写这个。请将其放在map
步骤中:
Promise.map(xs, function(x) {
return f(x).then(function(y) {
return {x:x, y:y};
});
})
事实上,你根本没有任何缩减步骤,因为map
已经收集了数组中的结果。
当然,您可以将其拆分为两个并通过执行
来压缩代码Promise.map(xs, f).map(function(y, i) {
return {x:xs[i], y:y};
})
但我不认为xs[i]
事情要好得多。
答案 1 :(得分:3)
这是我写的方式,我在蓝鸟中通过Babel使用ES6代码。
import {props, map} from "bluebird";
map(xs, x => props({x, y:square(x)}); // do something with it :)
这使用Promise.props
来等待对象的属性。