Javascript 如何使用Bluebird解析一组承诺和价值观

Javascript 如何使用Bluebird解析一组承诺和价值观,javascript,promise,bluebird,Javascript,Promise,Bluebird,我有一个清单 xs = [1, 2, 3, 4] 我还有一个异步函数square,它返回传递给它的参数的平方的承诺。我想并行地将to列表的元素传递给我的函数,然后将承诺收集到一个数组中,等待它们全部完成。我可以将其表述为map/reduce操作 Promise .map(xs, function(x) { return square(x) } ) .reduce(function(ys, y) { return ys.concat(y) }, [

我有一个清单

xs = [1, 2, 3, 4]
我还有一个异步函数
square
,它返回传递给它的参数的平方的承诺。我想并行地将to列表的元素传递给我的函数,然后将承诺收集到一个数组中,等待它们全部完成。我可以将其表述为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
属性中的承诺。如何编写Bluebird代码来执行此reduce步骤?

您不会在
reduce
步骤中编写此代码。将其放在
map
步骤中:

Promise.map(xs, function(x) {
    return f(x).then(function(y) {
        return {x:x, y:y};
    });
})
事实上,您根本不需要任何reduce步骤,因为
map
已经在数组中收集了结果

当然,您可以将其一分为二,并通过

Promise.map(xs, f).map(function(y, i) {
    return {x:xs[i], y:y};
})

但是我不认为
xs[I]
这件事好得多。

下面是我如何编写它的,我在我的蓝鸟中通过Babel使用ES6代码

import {props, map} from "bluebird";

map(xs, x => props({x, y:square(x)}); // do something with it :)

这使用
Promise.props
等待对象的属性

这是相切的,但在您的原始代码中,您实际上不需要执行
.map(xs,function(x){return square(x);})
square
是一个函数,您只需将它传入:
.map(xs,square)