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

时间:2019-03-07 20:54:34

标签: javascript node.js promise es6-promise

以下代码:

public class ComplexObject {

    private String a;
    private String b; 
    ...
    private String z;

    //getters and setters
}

运行该命令时,我得到以下输出(对我来说这没有意义)

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)。

此外,它还会创建promise,并在promise中的之前内执行代码。我希望“返回p1”会在 “ p1完成”之前出现,因为我认为承诺中的内容将在下一个刻度执行。

1 个答案:

答案 0 :(得分:2)

  

此外,它还会创建promise,并在promise创建之后的代码之前执行promise中的代码。我希望“返回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