关于Node.js Promise然后返回?

我对Promise感到困惑!

我使用Promise然后没有像这样回报:

new Promise((resolve, reject) => { resolve("1"); }).then((v1) => { console.log("v1"); new Promise((resolve, reject) => { //Time-consuming operation, for example: get data from database; setTimeout(() => { resolve(2) }, 3000); }).then((v11) => { console.log("v11"); }) }).then((v2) => { console.log("v2") }); 

我得到这个结果v1 v2 v11 。 然后,我用另一种方式写,如下所示:

  new Promise((resolve, reject) => { resolve("1"); }).then((v1) => { console.log("v1"); return new Promise((resolve, reject) => { setTimeout(() => { resolve(2) }, 3000) }).then((v11) => { console.log("v11"); }) }).then((v2) => { console.log("v2") }); 

我得到另一个结果v1 v11 v2

也许,还有另一种情况:

 new Promise((resolve, reject) => { resolve("1"); }).then((v1) => { console.log("v1"); return new Promise((resolve, reject) => { setTimeout(() => {resolve(2)}, 3000) }).then((v11) => { console.log("v11"); return new Promise((resolve, reject) => { setTimeout(() => {resolve(2)}, 4000) }).then(() => { console.log("v12") }) }) }).then((v2) => { console.log("v2") }); 

我得到这个结果v1 v11 v12 v2

我不明白第二个回报我想知道为什么我得到这个结果?

如果你实际打印已解决的promise的值,而不仅仅是variables的名字,那么理解控制stream将会更容易:

版本1

 new Promise((resolve, reject) => { resolve("1"); }).then((v1) => { console.log("v1:", v1); new Promise((resolve, reject) => { //Time-consuming operation, for example: get data from database; setTimeout(() => { resolve(2) }, 3000); }).then((v11) => { console.log("v11:", v11); }) }).then((v2) => { console.log("v2:", v2) }); 

版本2

 new Promise((resolve, reject) => { resolve("1"); }).then((v1) => { console.log("v1:", v1); return new Promise((resolve, reject) => { setTimeout(() => { resolve(2) }, 3000) }).then((v11) => { console.log("v11:", v11); }) }).then((v2) => { console.log("v2:", v2) }); 

版本3

 new Promise((resolve, reject) => { resolve("1"); }).then((v1) => { console.log("v1:", v1); return new Promise((resolve, reject) => { setTimeout(() => {resolve(2)}, 3000) }).then((v11) => { console.log("v11:", v11); return new Promise((resolve, reject) => { setTimeout(() => {resolve(2)}, 4000) }).then((v12) => { console.log("v12:", v12) }) }) }).then((v2) => { console.log("v2:", v2) }); 

现在你可以看到传递给callback的东西了:

结果1

 v1: 1 v2: undefined v11: 2 

结果2

 v1: 1 v11: 2 v2: undefined 

结果3

 v1: 1 v11: 2 v12: 2 v2: undefined 

说明

正如你在.then()处理程序中看到的那样.then()你不会返回一个promise,就好像你已经返回一个已经parsing好的值undefined – 就像你做的那样:

 return Promise.resolve(undefined); 

因此可以立即调用下一个.then()处理程序。

另一方面,如果您返回尚未解决的承诺,则不会立即调用下一个.then()处理程序,而只会在返回的承诺得到解决之后才调用。

这就解释了当你不返回一个承诺时执行的顺序是不一样的,而且会发生什么,就好像一个已经解决的承诺隐含地返回给你。