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

标签 javascript websocket async-await queue throttling

我有一个打开的 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/

相关文章:

javascript - 如何使用 Node.js 和 socket.io 设置 gzip 编码?

c# - 如何从 ApiController 中的 StringContent 对象读取 JSON?

c# - 如何从异步方法向调用者抛出异常?

javascript - Bluebird 中的嵌套 promise

JavaScript:构造函数与原型(prototype)

javascript - 对 javascript 键名进行排序

javascript - THREE.PointerLockControls 不锁定我的指针

javascript - WebSocket `closing` 与 `closed` readState 有什么区别?

c# - Async方法在什么情况下应该支持取消

java - 互联网连接重新启动时 Websocket 不工作