嵌套的promise执行顺序
2019-11-30 本文已影响0人
小猪佩奇的王子
外部promise有多个then链式调用,第一个then里面执行另一个promise,也带多个then链式调用,他们的执行顺序会是怎样?
new Promise((resolve, reject) => {
console.log("log: 外部promise")
resolve()
})
.then(() => {
console.log("log: 外部第一个then")
new Promise((resolve, reject) => {
console.log("log: 内部promise")
resolve()
})
.then(() => {
console.log("log: 内部第一个then")
})
.then(() => {
console.log("log: 内部第二个then")
})
})
.then(() => {
console.log("log: 外部第二个then")
})
答案
log: 外部promise
log: 外部第一个then
log: 内部promise
log: 内部第一个then
log: 外部第二个then
log: 内部第二个then
尝试解释
1,new promsie是同步代码,立即执行
2,外部promise第一个then需要等外部promise被resolve后才执行,外部promise立即被resolve,于是执行注册的then回调。此时外部第二then并未执行,因为他等待的是外部第一个then返回的promise
3,进入外部第一个then,回调里面是一个promise,执行内部promise时,同样两个then链式调用,内部第一个then执行后,内部promise算执行完,返回一个新的promise给内部第二then用
4,外部第一个then执行完且有返回值,进入外部第二then
5,之后执行内部第二then
看一个例子
var p = new Promise((resolve, reject) => {
resolve("good")
})
p.then(x => console.log("x:1", x))
p.then(x => console.log("x:2", x))
p这个promise注册了两个then,注意跟链式调用then
的区别,这个就像发布订阅模式,有两个监听者,resolve时,这两个then同时执行,看完这个应该对上面理解有帮助