当事件处于待处理状态时附加新侦听器会发生什么?

时间:2018-02-14 18:56:03

标签: javascript asynchronous listener web-worker

假设我有一个网络工作者_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已经触发了一个消息事件,并且事件循环正在等待触发第一个侦听器?第二个侦听器是否会包含在要通知事件的侦听器列表中?

1 个答案:

答案 0 :(得分:1)

  

当我们附加第二个侦听器时,worker已经触发了一个消息事件,并且事件循环正在等待触发第一个侦听器

是的,第二个侦听器将包含在要在此处通知事件的侦听器列表中。如果事件循环仍在等待调用侦听器,则主进程中尚未发生事件,即使工作者已经触发它并且它​​正在队列中等待。

您可能确实错过事件的边缘情况是,如果在执行创建message之前运行的window.test侦听器期间创建了promise,即当您有多个回调侦听时同一事件。因此,最好立即安装监听器,特别是当你要为它做出承诺时。您可以立即创建承诺:

window.test = new Promise(resolve => {
    _worker.addEventListener('message', (event) => {
         resolve(event.data || "foo");
    });
});

然后在任何地方使用承诺(根据需要多次使用)。当承诺已经为您做好时,无需自己存储和缓存数据值。