根据 MDN,JavaScript 事件循环中的消息“运行至完成”。
(https://developer.mozilla.org/docs/Web/JavaScript/Event_loop#run-to-completion)
但我创造了一个案例,这种情况似乎不会发生。
abortController1 = new AbortController()
abortController2 = new AbortController()
abortController1.signal.addEventListener("abort", () =>
{
console.log("abort 1 start")
abortController2.abort()
console.log("abort 1 end")
})
abortController2.signal.addEventListener("abort", () =>
{
console.log("abort 2")
})
abortController1.abort()
输出:
abort 1 start
abort 2
abort 1 end
我期待看到这个输出:
abort 1 start
abort 1 end
abort 2
有人可以解释一下这是怎么回事吗?
当事件由代码直接触发时,它会同步运行侦听器。 dispatchEvent() 的 MDN 文档解释了这一点:
与“本机”事件(由浏览器触发并通过事件循环异步调用事件处理程序)不同,
同步调用事件处理程序。所有适用的事件处理程序都会在
dispatchEvent()
返回之前调用并返回。
dispatchEvent()
虽然这没有具体提到
abort()
,但我认为没有理由不以类似方式对待它。