访问先前履行的承诺会导致承诺链

lOl*_*ive 6 javascript promise

在使用promises进行编码时,在一系列承诺中访问很久以前的数据是正确的模式是什么?

例如:

do_A.then(do_B).then(do_C).then(do_D).then(do_E_WithTheDataComingFrom_A_And_C_OnlyWhen_D_IsSuccesfullyCompleted)
Run Code Online (Sandbox Code Playgroud)

我目前的解决方案:通过链路传递单个JSON结构,并让每个步骤填充它.有什么意见吗?

Ben*_*aum 2

是的,这是将状态与操作链接起来的正确方法。

链接.then语句非常常见,通常是我们在管道传输时的构建块。这是承诺的核心。

你所做的既正确又惯用。


为了好奇心,让我们展示一下这一点。

为了验证这一点 - 我们可以检查承诺规范。

我们想验证一下:

  1. 它链
  2. 在拒绝的情况下,它不会调用链接中的处理程序 then
  3. then它拒绝以相同原因返回的下一个承诺
  4. 它按顺序执行并传递返回值。

让我们使用规范按顺序验证这些- 特别是.then

1.它是连锁的

7.1 然后必须返回一个承诺[3.3]。

太好了,让我们验证一下它是否也与fulfillment相关

如果 onFulfilled 或 onRejected 返回值 x,则运行承诺解析过程 >[[Resolve]](promise2, x)。

太好了,所以我们知道当我们的 Promise 解决或拒绝时,我们的then处理程序就会使用适当的参数调用。所以.then(do_A).then(do_B)假设解决的话总是会起作用do_A

2. 在拒绝的情况下,它不会调用链式 then 中的处理程序

7.四. 如果 onRejected 不是一个函数并且 Promise1 被拒绝,那么 Promise2 也必须以同样的原因被拒绝。

太好了,所以如果它在那里,它就会拒绝并调用onRejected,如果不存在,它就会被锁住。

then3.它拒绝以相同原因返回的下一个承诺

我们刚刚在 2 中介绍了这一点。

4. 依次执行并传递返回值。

那又是

如果 onFulfilled 或 onRejected 返回值 x,则运行承诺解析过程 [[Resolve]](promise2, x)。

因此,如果您设置 onFulfilled 它将运行解决过程。解决过程本身规定:

Promise 解析过程是一个抽象操作,以 Promise 和值作为输入,我们将其表示为 [[Resolve]](promise, x)。如果 x 是 thenable,它会尝试让 Promise 采用 x 的状态,假设 x 的行为至少有点像 Promise。否则,它会以 x 值履行承诺。

如果/当使用值 y 调用resolvePromise 时,运行 [[Resolve]](promise, y)。

其中 y 是 x 的返回值。

伟大的!所以它有效。