gpt4 book ai didi

javascript - 您将如何实现 1. 异步事件队列 2. 具有事件合并功能

转载 作者:行者123 更新时间:2023-11-29 20:02:18 25 4
gpt4 key购买 nike

设置:

假设三个事件发生在某个应用程序的三个独立部分,事件应该由两个 Controller 处理。应用程序调度器负责发送/接收来自应用程序所有部分的事件,并且这个调度器应该有一个异步事件队列。

在某些情况下,三个事件中的两个沿某些属性相关但名称不同,并且应该只将一个传递给 Controller ​​,另一个可以丢弃。

问题:

目前,我有一个“队列”,它实际上只是将事件反弹到 Controller ,这是没有帮助的,因为我无法比较队列中的两个事件,如果当时只有一个事件存在的话。

那么我如何确保事件应该在队列中停留一段时间呢?我想超时功能可以解决问题,但有更好的方法吗?

值得称赞的是,合并事件的想法受到了 Cocoa 的启发,我基本上是在尝试做类似的事情。

最佳答案

我对 Cocoa 知之甚少,但我假设它会用最新事件替换旧事件,直到事件能够被分派(dispatch)给应用程序(即,如果应用程序由于某种原因而忙碌)。我不确定你的具体用例是什么,但如果你想对事件进行速率限制,我会像这样使用 setTimeout:

function Dispatcher(controllers) {
this.controllers = controllers;
this.events = [];
this.nextController = 0;
}
Dispatcher.prototype = {
_dispatch: function (i) {
var ev = this.events.splice(i, 1);
this.controllers[this.nextController].handle(ev);
this.nextController = (this.nextController + 1) % this.controllers.length;
},
notify: function (ev) {
var index = -1, self = this, replace;

function similer(e, i) {
if (e.type === ev.type) {
index = i;
return true;
}
}

replace = this.events.some(similar);
if (replace) {
this.events[i] = ev;
} else {
// it's unique
index = this.events.push(ev) - 1;
setTimeout(function () {
self._dispatch(index);
}, 100);
}
}
};

只需用事件调用notify(确保有type 属性或类似属性),它就会处理魔法。不同类型的事件将使用它们自己的 setTimeout 进行独特处理。

我没有测试过这段代码,所以可能存在错误。

关于javascript - 您将如何实现 1. 异步事件队列 2. 具有事件合并功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13731670/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com