如何使用Bluebird解决一组promise和值

W.P*_*ill 4 javascript promise bluebird

我有一个列表值

xs = [1, 2, 3, 4]
Run Code Online (Sandbox Code Playgroud)

我还有一个异步函数square,它返回传递给它的参数的平方的promise.我希望将我的列表元素并行传递给我的函数,然后将promises收集到一个数组中并等待它们全部完成.我可以将其表示为map/reduce操作.

Promise
.map(xs, function(x) {
        return square(x)
    }
)
.reduce(function(ys, y) {
        return ys.concat(y)
    }, [])
Run Code Online (Sandbox Code Playgroud)

这最终返回已解析的值

[1, 4, 9, 16]
Run Code Online (Sandbox Code Playgroud)

很容易.现在说我想在答案数组中包含原始参数.

[{x:1, y:1}, {x:2, y:4}, {x:3, y:9}, {x:4, y:16}]
Run Code Online (Sandbox Code Playgroud)

棘手的部分现在我有一个对象列表,每个对象在reduce步骤的开头都有一个隐藏在其y属性中的承诺.如何编写Bluebird代码来执行此缩减步骤?

Ber*_*rgi 5

你不会在这个reduce步骤中写这个.把它放在map步骤中:

Promise.map(xs, function(x) {
    return f(x).then(function(y) {
        return {x:x, y:y};
    });
})
Run Code Online (Sandbox Code Playgroud)

实际上,您根本没有任何缩减步骤,因为map它已经在数组中收集结果.

当然,您可以将其拆分为两个并通过执行操作来展平您的代码

Promise.map(xs, f).map(function(y, i) {
    return {x:xs[i], y:y};
})
Run Code Online (Sandbox Code Playgroud)

但我不认为那xs[i]件事好多了.