当事件未决时附加新的侦听器会发生什么?
What happens when new listener is attached when an event is pending?
假设我有一个 web worker _worker,我像这样附加一个监听器:
_worker.addEventListener('message', (event) => {
window["test"] = event.data||"foo"
});
假设我稍后有条件地将另一个侦听器附加到 promise 中,如下所示:
if (window["test"] === undefined) {
_worker.addEventListener('message', (event) => {
window["test"] = event.data || "foo";
resolve(window["test"])
});
}
else {
resolve (window["test"]);
}
基本上,第一个侦听器的工作是将 window["test"] 设置为事件数据。 promise 生成器检查 window["test"] 是否已被第一个侦听器设置;如果没有,我们附加另一个侦听器以在触发工作消息事件时解决承诺。
但是,如果在我们附加第二个侦听器时,worker 已经触发了一个消息事件,而事件循环正在等待触发第一个侦听器,该怎么办?第二个监听器会被包含在事件通知监听器列表中吗?
As we are attaching the second listener, the worker has already fired a message event, and the event loop is waiting to fire the first listener
是的,第二个侦听器将包含在此处要通知事件的侦听器列表中。如果事件循环仍在等待调用侦听器,则该事件尚未在主进程中真正发生,即使 worker 已触发它并在队列中等待。
如果承诺是在 message
侦听器执行期间创建的,该侦听器在创建 window.test
的侦听器之前运行,即当您有多个监听相同事件的回调。因此,最好立即安装侦听器,尤其是当您无论如何都要为其做出承诺时。您可以立即创建承诺:
window.test = new Promise(resolve => {
_worker.addEventListener('message', (event) => {
resolve(event.data || "foo");
}, {once: true});
});
然后到处使用承诺(根据需要多次使用)。当 promises 已经为您存储和缓存数据值时,您无需自己存储和缓存数据值。
假设我有一个 web worker _worker,我像这样附加一个监听器:
_worker.addEventListener('message', (event) => {
window["test"] = event.data||"foo"
});
假设我稍后有条件地将另一个侦听器附加到 promise 中,如下所示:
if (window["test"] === undefined) {
_worker.addEventListener('message', (event) => {
window["test"] = event.data || "foo";
resolve(window["test"])
});
}
else {
resolve (window["test"]);
}
基本上,第一个侦听器的工作是将 window["test"] 设置为事件数据。 promise 生成器检查 window["test"] 是否已被第一个侦听器设置;如果没有,我们附加另一个侦听器以在触发工作消息事件时解决承诺。
但是,如果在我们附加第二个侦听器时,worker 已经触发了一个消息事件,而事件循环正在等待触发第一个侦听器,该怎么办?第二个监听器会被包含在事件通知监听器列表中吗?
As we are attaching the second listener, the worker has already fired a message event, and the event loop is waiting to fire the first listener
是的,第二个侦听器将包含在此处要通知事件的侦听器列表中。如果事件循环仍在等待调用侦听器,则该事件尚未在主进程中真正发生,即使 worker 已触发它并在队列中等待。
如果承诺是在 message
侦听器执行期间创建的,该侦听器在创建 window.test
的侦听器之前运行,即当您有多个监听相同事件的回调。因此,最好立即安装侦听器,尤其是当您无论如何都要为其做出承诺时。您可以立即创建承诺:
window.test = new Promise(resolve => {
_worker.addEventListener('message', (event) => {
resolve(event.data || "foo");
}, {once: true});
});
然后到处使用承诺(根据需要多次使用)。当 promises 已经为您存储和缓存数据值时,您无需自己存储和缓存数据值。