.then()回调不等待第一个承诺被触发

时间:2019-01-27 11:42:59

标签: javascript

我正在尝试在代码中实现诺言,但是我很难掌握它的某些方面-即一个诺言触发链中另一个诺言的方式。以这个为例:

HTML:

<div class="test"></div>

Javascript:

const testTag = document.querySelector('.test')

const firstPromise = new Promise((resolve) => {
  testTag.addEventListener('click', () => {
    doSomething()
  })
  resolve()
})

const secondPromise = () => {
  firstPromise.then(() => {
    setTimeout(function () {
      console.log('This log happened 5 seconds after testTag was clicked')
    }, 5000)  
  })
}

secondPromise()

但是发生的是:日志立即发生,它从不等待click事件运行。这是为什么?第二个诺言难道不应该在第一个诺言得到解决之后发生吗?

1 个答案:

答案 0 :(得分:4)

  

日志立即发生,它从不等待点击事件运行。

创建点击事件处理程序后,您立即调用resolve()

在致电resolve()之前,您不必等待点击。

const firstPromise = new Promise((resolve) => {
  testTag.addEventListener('click', () => {
    doSomething()
    resolve()
  })
})

请注意,除非doSomething()涉及删除事件处理程序,否则该元素可能会再次被单击,从而导致再次尝试解决诺言,这将失败。