我正在尝试在代码中实现诺言,但是我很难掌握它的某些方面-即一个诺言触发链中另一个诺言的方式。以这个为例:
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事件运行。这是为什么?第二个诺言难道不应该在第一个诺言得到解决之后发生吗?
答案 0 :(得分:4)
日志立即发生,它从不等待点击事件运行。
创建点击事件处理程序后,您立即调用resolve()
。
在致电resolve()
之前,您不必等待点击。
const firstPromise = new Promise((resolve) => {
testTag.addEventListener('click', () => {
doSomething()
resolve()
})
})
请注意,除非doSomething()
涉及删除事件处理程序,否则该元素可能会再次被单击,从而导致再次尝试解决诺言,这将失败。