javascript - 在 promise 链中访问先前履行的 promise 结果

标签 javascript promise

<分区>

在使用 promises 编码时,访问 promises 链中很久以前的数据的正确模式是什么?

例如:

do_A.then(do_B).then(do_C).then(do_D).then(do_E_WithTheDataComingFrom_A_And_C_OnlyWhen_D_IsSuccesfullyCompleted)

我当前的解决方案:通过链传递单个 JSON 结构,并让每个步骤填充它。 对此有何看法?

最佳答案

我认为对此没有一种“正确”的模式。您的解决方案听起来不错,但是,它有点紧密耦合。它可能非常适合您的情况,但我发现它作为一般模式存在一些问题:

  1. 参与步骤需要就收集器对象的结构达成一致。

  2. 每一步都至少需要参与对象的转发,如果链条很长并且偶尔需要以前的数据,这会变得很乏味。这对于插入不是您编写的步骤也是不灵活的(链接并不总是线性发生)。

  3. 换句话说:除非 do_A|B|C|D 和 do_E 都在您的控制之下,否则您需要用样板将它们包装起来,以将收集器对象存储在闭包中,并与函数相互转换自然输入和结果,因为函数不会“在”您的模式中。

  4. 另一方面,如果函数中,那么步骤之间的数据依赖性实际上已经隐藏在函数内部。这可能看起来很干净,但可能会成为维护问题。例如:如果这是一个团队项目,那么有人可能认为他们可以重新排列您的步骤,而在调用模式中没有任何线索 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/

相关文章:

javascript - 如何在移动设备上存储配置信息?

javascript - 每次递归调用函数之间的延迟

javascript - 异步调用后在 React 中重新渲染状态

angular - 在渲染 View /模板之前等待 Angular 2 加载/解析模型

javascript - 分解如何对数组中的数字进行排序

javascript - 在React组件文件夹中编译SASS文件

javascript - 如何检查一个对象是否存在于数组中并在 AngularJS 中给它一个 ng 类

javascript - 第一次点击后 href 不运行,但 onclick 运行

javascript - 是否存在模仿 should.throws 的 shouldjs 函数?

javascript - JavaScript 中的 Deferred、Promise 和 Future 有什么区别?