【发布时间】:2017-04-17 18:43:29
【问题描述】:
说我有这个:
function getAllPromises(key: string, val: any): Promise {
const subDeps = someHash[key];
const acc = {}; // accumulated value
return subDeps.reduce(function (p, k) {
return p.then(v => getAllPromises(k, v)).then(function (v) {
acc[k] = v;
return acc;
});
}, Promise.resolve(val));
}
有没有办法避免不得不声明一个单独的变量:
const acc = {}; // accumulated value
并以某种方式从承诺链中返回?
最终,acc 变量是从承诺链中得到解决的,但我想知道我是否可以以某种方式避免不得不在链“外部”声明它。
编辑:类似这样的种子数据如下所示:
{
'one': [function (v) {
return Promise.resolve('one');
}],
'two': ['one', function (v) {
return Promise.resolve('two');
}],
'three': ['one', 'two', function (v) {
return Promise.resolve('three');
}],
}
它只是一个声明性依赖树。依赖关系可以并行解决;但在它们运行时可能会有效地阻塞。例如,如果我有这样的功能:
function foo(one,two,three){
}
我想注入这 3 个依赖项。它们可以“并行”采购,但three 将被阻止,直到one 和two 被采购。
subDeps 变量是什么?在 key="three" 的情况下,subDeps 是 ['one','two']。
【问题讨论】:
-
所以有几个问题可以很好地回答这个问题:(一个)初始运行
subDeps.reduce(暂时忘记递归),你传入初始对象,然后此后,您将传入新的累加器。那么每个子依赖项的element[0]是否期望父项,其余的期望一个增长的对象? (二)subDeps 的数组实际上是连续的吗?它们是否依赖于按该顺序解析,或者它们是可以并行化的兄弟键?据我猜测,兄弟键不需要按照它们定义的顺序排列,这样更简单。 -
是的,问题是在递归的任何给定级别上,顶级参数“val”可以是任何东西,正如我用“any”类型指出的那样。
-
使用 acc 作为自变量,确保存在一个对象,我们可以将键/值附加到该对象。但出于好奇,我只是想知道是否有办法简化它。
-
但问题是:
subDeps[0]是否真的需要传入的value(而subDeps[1 - n]不需要)?在考虑您的问题时,看起来我可以重构它,使其不需要key或value作为递归输入,而是需要someHash和subDeps。仅当我可以并行运行subDeps而不是等待每个都按顺序完成时,这才是正确的。 -
@Norguard 你是对的,subDeps 可以并行运行;以我现在的方式,它们几乎是串联的。好主意。
标签: javascript node.js es6-promise