gpt4 book ai didi

javascript - 如何在 javascript 中对传入的 websocket 事件进行排队以执行缓慢?

转载 作者:行者123 更新时间:2023-12-05 04:28:02 25 4
gpt4 key购买 nike

我有一个打开的 Websocket 连接,它正在分发事件。一切都很好,但是一旦一个新事件到来,我需要做很多事情,有时事件一个接一个地到来得太快,以至于没有时间把事情做好。我需要在这个函数中有某种队列,告诉事件放轻松,每秒最多只继续进行一次,否则在某种队列中等待,直到第二个过去,然后继续。

编辑:不幸的是,不允许使用外部库。

ws = new WebSocket(`wss://hallo.com/ws/`);
ws.onmessage = readMessage;

async function readMessage(event) {
print(event)
//do important things
//but not too frequently!
}

我该怎么做?

我找到了 this但这超出了我简单的头脑:

“你可以有一个类似队列的 promise ,它不断积累 promise 以确保它们按顺序运行:

let cur = Promise.resolve();

function enqueue(f) {
cur = cur.then(f); }

function someAsyncWork() {
return new Promise(resolve => {
setTimeout(() => {
resolve('async work done');
}, 5);
}); } async function msg() {
const msg = await someAsyncWork();
console.log(msg); }

const main = async() => {

web3.eth.subscribe('pendingTransactions').on("data", function(tx) {
enqueue(async function() {
console.log('1st print: ',tx);
await msg();
console.log('2nd print: ',tx);
});
}) }

main();

最佳答案

老实说,我会使用像 lodash 的 throttle 这样的东西去做这个。以下代码段应该可以解决您的问题。

ws = new WebSocket(`wss://hallo.com/ws/`);
ws.onmessage = _.throttle(readMessage, 1000);

async function readMessage(event) {
print(event)
//do important things
//but not too frequently!
}

关于javascript - 如何在 javascript 中对传入的 websocket 事件进行排队以执行缓慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72695396/

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