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

时间:2015-05-10 20:26:26

标签: javascript promise bluebird

我有一个列表值

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代码来执行此缩减步骤?

2 个答案:

答案 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来等待对象的属性。