【发布时间】:2018-03-16 00:06:32
【问题描述】:
我想并行运行异步事物的动态列表,其中有些事情需要先完成其他事情,然后才能访问所有聚合结果。到目前为止,我想出了通过 multidim 迭代。操作数组,但它需要包装函数/闭包,所以我对它并不完全满意。我想知道人们还在为这种情况做些什么。
var runAllOps = function(ops) {
var all = []; // counter for results
var runOperations = function runOperations(ops) {
var set = ops.shift();
return Promise.map(set, function(op){
return op.getData.call(null, op.name)
})
.then(function(results){
all.push(results)
if (ops.length){
return runOperations(ops)
} else {
return _.flatten(all)
}
})
}
return runOperations(ops)
}
操作如下:
var operations = [
[
{name: 'getPixieDust', getData: someAsyncFunction},
{name: 'getMandrake', getData: etc},
],
[
{name: 'makePotion', getData: brewAsync}
]
]
有没有什么好的方法来映射依赖关系和承诺?能够像这样会很好:
makePotion: [getPixieDust, getMandrake]
然后把整个事情交给一个知道 getPixieDust 和 getMandrake 在调用 makePotion 之前先完成的东西。而不是当前的实现只是将依赖操作放在后面的数组中
【问题讨论】:
-
过去我们实际上已经讨论过向 Bluebird 添加类似的东西(使用 getter)。这就是我要做的 - 如果 makePotion 上的 getData 需要 getPixieDust 上的 getData - 让 getPixieDust 在
makePotion上调用承诺本身并缓存它。
标签: javascript concurrency promise bluebird