繁体   English   中英

此行为的解释是什么:ES6 Promise从未解决

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM