<分区>
在使用 promises 编码时,访问 promises 链中很久以前的数据的正确模式是什么?
例如:
do_A.then(do_B).then(do_C).then(do_D).then(do_E_WithTheDataComingFrom_A_And_C_OnlyWhen_D_IsSuccesfullyCompleted)
我当前的解决方案:通过链传递单个 JSON 结构,并让每个步骤填充它。 对此有何看法?
<分区>
在使用 promises 编码时,访问 promises 链中很久以前的数据的正确模式是什么?
例如:
do_A.then(do_B).then(do_C).then(do_D).then(do_E_WithTheDataComingFrom_A_And_C_OnlyWhen_D_IsSuccesfullyCompleted)
我当前的解决方案:通过链传递单个 JSON 结构,并让每个步骤填充它。 对此有何看法?
最佳答案
我认为对此没有一种“正确”的模式。您的解决方案听起来不错,但是,它有点紧密耦合。它可能非常适合您的情况,但我发现它作为一般模式存在一些问题:
参与步骤需要就收集器对象的结构达成一致。
每一步都至少需要参与对象的转发,如果链条很长并且偶尔需要以前的数据,这会变得很乏味。这对于插入不是您编写的步骤也是不灵活的(链接并不总是线性发生)。
换句话说:除非 do_A|B|C|D 和 do_E 都在您的控制之下,否则您需要用样板将它们包装起来,以将收集器对象存储在闭包中,并与函数相互转换自然输入和结果,因为函数不会“在”您的模式中。
另一方面,如果函数在中,那么步骤之间的数据依赖性实际上已经隐藏在函数内部。这可能看起来很干净,但可能会成为维护问题。例如:如果这是一个团队项目,那么有人可能认为他们可以重新排列您的步骤,而在调用模式中没有任何线索 do_E 需要什么输入。
我会建议使用闭包的更直接的方法:
var a, c;
do_A()
.then(function(result) { a = result; return do_B(); })
.then(do_C)
.then(function(result) { c = result; return do_D(); })
.then(function() {
return do_E_WithTheDataComingFrom_A_And_C_OnlyWhen_D_Succeeds(a, c);
})
.catch(failed);
没有要定义的收集器对象; do_A|B|C|D 和 do_E 可以是不知道任何模式的通用函数;除非依赖于返回的数据(do_B 和 do_D),否则没有样板;并且数据依赖性(a 和 c)是明确的。
关于javascript - 在 promise 链中访问先前履行的 promise 结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18318507/