假设我有一个网络工作者_worker,我会像这样附上一个监听器:
_worker.addEventListener('message', (event) => {
window["test"] = event.data||"foo"
});
让我说我后来有条件地将另一个听众附加在承诺中,如此:
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已经触发了一个消息事件,并且事件循环正在等待触发第一个侦听器?第二个侦听器是否会包含在要通知事件的侦听器列表中?
答案 0 :(得分:1)
当我们附加第二个侦听器时,worker已经触发了一个消息事件,并且事件循环正在等待触发第一个侦听器
是的,第二个侦听器将包含在要在此处通知事件的侦听器列表中。如果事件循环仍在等待调用侦听器,则主进程中尚未发生事件,即使工作者已经触发它并且它正在队列中等待。
您可能确实错过事件的边缘情况是,如果在执行创建message
之前运行的window.test
侦听器期间创建了promise,即当您有多个回调侦听时同一事件。因此,最好立即安装监听器,特别是当你要为它做出承诺时。您可以立即创建承诺:
window.test = new Promise(resolve => {
_worker.addEventListener('message', (event) => {
resolve(event.data || "foo");
});
});
然后在任何地方使用承诺(根据需要多次使用)。当承诺已经为您做好时,无需自己存储和缓存数据值。