[英]What's the explanation for this behavior: ES6 Promise that is never resolved
如下代码:
Promise.resolve('a string')
.then(resp => {
console.log('resp from the initial promise: ' + resp)
const p0 = new Promise((resolve, reject) => {
setTimeout(() => {
console.log('finished sleeping in p0')
resolve('hello from p0')
}, 5000)
})
console.log('returning p0')
return p0
})
.then(resp => {
console.log('resp from p0: ' + resp)
const p1 = new Promise((resolve, reject) => {
console.log('p1 completed')
// resolve('another string from p1')
})
console.log('returning p1')
return p1
})
.then(res => {
console.log('resp from p1: ' + res)
})
.catch(err => {
console.error('Error: ' + err.message)
})
console.log('last statement')
运行该命令时,得到以下输出(对我来说这没有意义)
last statement
resp from the initial promise: a string
returning p0
finished sleeping in p0
resp from p0: hello from p0
p1 completed
returning p1
首先,由于承诺p1
从未解决,我希望程序永远等待,永远不会完成。 事实并非如此,它可以很好地完成(尽管没有到达最后的then()
)。
此外,它会创建承诺并在创建后的代码之前在承诺内执行代码。 我希望“返回p1”会在 “ p1完成” 之前出现,因为我认为承诺中的内容将在下一个刻度执行。
此外,它会创建承诺并在创建后的代码之前在承诺内执行代码。 我希望“返回p1”会在“ p1完成”之前出现,因为我认为承诺中的内容将在下一个刻度执行。
如果在诺言中调用.then
,则传入的功能将延迟到下一个刻度。 但是,promise的构造函数的行为并不如此。 当您构造一个new Promise
,传递给构造函数的代码将立即并同步运行。 所以这段代码:
const p0 = new Promise((resolve, reject) => {
setTimeout(() => {
console.log('finished sleeping in p0')
resolve('hello from p0')
}, 5000)
})
console.log('returning p0')
...将立即设置一个超时,甚至在将承诺分配给p0
。 这段代码:
const p1 = new Promise((resolve, reject) => {
console.log('p1 completed')
// resolve('another string from p1')
})
console.log('returning p1')
...将立即注销“ p1完成”,甚至没有将诺言分配给p1
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.