如何使用 Bluebird 解决一组承诺和价值观
How to resolve a set of promises and values using Bluebird
我有一个列表值
xs = [1, 2, 3, 4]
我还有一个异步函数 square
,returns 承诺传递给它的参数的平方。我想将 my to list 的元素并行传递给我的函数,然后将 promises 收集到一个数组中并等待它们全部完成。我可以将其表述为 map/reduce 操作。
Promise
.map(xs, function(x) {
return square(x)
}
)
.reduce(function(ys, y) {
return ys.concat(y)
}, [])
这最终returns 解析值
[1, 4, 9, 16]
很简单。现在说我想像这样在答案数组中包含原始参数。
[{x:1, y:1}, {x:2, y:4}, {x:3, y:9}, {x:4, y:16}]
棘手的部分是现在我有一个对象列表,每个对象在减少步骤开始时都有一个承诺埋在它的 y
属性 中。如何编写 Bluebird 代码来执行此减少步骤?
你不会在 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]
事情好多了。
我是这样写的,我在我的 bluebird 中通过 Babel 使用 ES6 代码。
import {props, map} from "bluebird";
map(xs, x => props({x, y:square(x)}); // do something with it :)
这使用 Promise.props
等待对象的属性。
我有一个列表值
xs = [1, 2, 3, 4]
我还有一个异步函数 square
,returns 承诺传递给它的参数的平方。我想将 my to list 的元素并行传递给我的函数,然后将 promises 收集到一个数组中并等待它们全部完成。我可以将其表述为 map/reduce 操作。
Promise
.map(xs, function(x) {
return square(x)
}
)
.reduce(function(ys, y) {
return ys.concat(y)
}, [])
这最终returns 解析值
[1, 4, 9, 16]
很简单。现在说我想像这样在答案数组中包含原始参数。
[{x:1, y:1}, {x:2, y:4}, {x:3, y:9}, {x:4, y:16}]
棘手的部分是现在我有一个对象列表,每个对象在减少步骤开始时都有一个承诺埋在它的 y
属性 中。如何编写 Bluebird 代码来执行此减少步骤?
你不会在 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]
事情好多了。
我是这样写的,我在我的 bluebird 中通过 Babel 使用 ES6 代码。
import {props, map} from "bluebird";
map(xs, x => props({x, y:square(x)}); // do something with it :)
这使用 Promise.props
等待对象的属性。