链接JavaScript承诺

时间:2017-02-25 10:39:16

标签: javascript promise

我正在阅读一本名为Angular 2 Cookbook的教科书。在第4章中,有一个链接Promises部分,其中包含以下代码

const incr = val => { console.log(val); return ++val;};

var outerResolve;

const firstPromise = new Promise((resolve,reject) => { outerResolve = resolve;});

firstPromise.then(incr);

const secondPromise = firstPromise.then(incr);

const thirdPromise = secondPromise.then(incr);

outerResolve(0);

显示的输出是

//0 0 0 1 1 2

//According to me output should be 0 0 1

有人可以解释一下书中给出的结果以及我对这个重要概念的理解中的错误吗?

2 个答案:

答案 0 :(得分:1)

本书示例中显示的输出不正确。 正确的输出是0 0 1.

如果父承诺得到解决,那么它会触发孩子承诺得到解决。所以发生以下情况。

  1. 应该解析firstPromise,并且应该调用其处理程序(在本例中为2)输出0和0,因为处理程序没有链接。

  2. 然后应该解析secondPromise并且应该将其处理程序称为输出1.

  3. 然后应该解决thirdPromise,因为它没有处理程序,所以不会输出任何内容。

答案 1 :(得分:1)

本书中的代码将正确记录为;

0
0
0
1
1
2

但是你还没有完整地分析这个例子。您在问题中提供的代码段只是它的一半。书中的示例代码如下:

const incr = val => { console.log(val); return ++val;};

var outerResolve;

const firstPromise = new Promise((resolve,reject) => { outerResolve = resolve;});

firstPromise.then(incr);

const secondPromise = firstPromise.then(incr);

const thirdPromise = secondPromise.then(incr);

outerResolve(0);

secondPromise.then(incr);
firstPromise.then(incr);
thirdPromise.then(incr);