如何通过HTTP请求修复setTimeout行为?

在我的客户端应用程序上,我正在使用Socket IO检查未读事件。我向后端提出了一个请求,该请求将超时设置为5秒,然后继续检查未读事件并将其发送回去。

// client
socket.on("response",({ mostRecentMessages }) => {
    // do some stuff first
    socket.emit("listenForNew",{ userId,currentMessagesFromEveryone });
})
// backend
  socket.on("listenForNew",({ userId,currentMessagesFromEveryone }) => {
    if (currentMessagesFromEveryone && userId) {
      const { MostRecentMessages } = require("./constants/models");

      const filteredIds = [];

      currentMessagesFromEveryone.forEach(message => {
        filteredIds.push(message.conversation._id);
      });

      console.log("Entered!");

      setTimeout(async () => {
        const mostRecentMessages = await MostRecentMessages.find({
          to: userId,date: { $gt: connectedUsersAllMessages[userId].timeIn },conversation: { $nin: filteredIds }
        }).populate("to from conversation");

        allMessagesSocket.sockets.connected[
          connectedUsersAllMessages[userId].socketId
        ].emit("response",{
          mostRecentMessages
        });
      },5000);
    }
  });

起初,它工作正常。它一次打印Entered!约4、5个请求。然后在6号,它开始打印Entered!两次。

为什么会这样,我在做什么错了?

hliyouheng 回答:如何通过HTTP请求修复setTimeout行为?

我支持以下方法:

  • 等待X秒(在我们的用例中为5)
  • 调用异步操作(执行时间未知)
  • 等待直到异步执行完成
  • 再等待X秒,再执行下一个呼叫

实施可能是这样的:

const interval = 5000;

function next() {
  setTimeout(async () => myAsyncOperation(),interval);
}

function myAsyncOperation() {
   const mostRecentMessages = await MostRecentMessages.find({
      to: userId,date: { $gt: connectedUsersAllMessages[userId].timeIn },conversation: { $nin: filteredIds }
    }).populate("to from conversation");

    allMessagesSocket.sockets.connected[
      connectedUsersAllMessages[userId].socketId
    ].emit("response",() => {
      mostRecentMessages();
      next(); // "next" function call should be invoked only after "mostRecentMessages" execution is completed (or a race condition may be applied)
    }); 
}

next();

我还没有编译这段代码,但是我希望这个概念很清楚

本文链接:https://www.f2er.com/3124988.html

大家都在问