如何等待socketIO客户端发出

2024-10-02 22:33:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我想创建一个函数,expressserver将向客户机(python)发送该函数,python将做一些事情并将结果发送回服务器。服务器将等待客户端发出的结果,并将该结果返回给前端。若过了一段时间,python仍然并没有发出任何消息,express server会告诉前端并没有收到任何结果。我可以使用承诺并设置超时来等待python发出消息吗


Tags: 函数服务器消息客户端客户机server事情express
1条回答
网友
1楼 · 发布于 2024-10-02 22:33:01

应该没什么问题。请参阅socket.io文档中的Acknowledgments。他们甚至有一个超时的例子:

// express server endpoint
app.get('/somethingcool', (req, res) => {

  // assuming socket will be the client socket of the python server
  socket.emit("do_something_i_will_wait", {/* data */}, withTimeout((response) => {

    console.log("success!");
    res.status(200).send(response);

  }, () => {

    console.log("timeout!");
    res.status(500).send("python took to long to reply");

  }, 5000));
    
});

// helper function for timeout functionality
const withTimeout = (onSuccess, onTimeout, timeout) => {
  let called = false;

  const timer = setTimeout(() => {
    if (called) return;
    called = true;
    onTimeout();
  }, timeout);

  return (...args) => {
    if (called) return;
    called = true;
    clearTimeout(timer);
    onSuccess.apply(this, args);
  }
}

确认是如何工作的

所以我们从服务器向客户机发送一些简单的消息,作为最后一个参数,我们将放置一个函数——这将是我们的确认函数

// server 

socket.emit("ferret", "tobi", (data_from_client) => {
  console.log(data_from_client); // data will be "woot"
});

在客户端,它看起来像这样。我们为事件侦听器“ferret”设置的回调包含两个参数,即从服务器传递到客户端的数据和确认函数

// client

client.on("ferret", (name, fn) => {
  fn("woot");
});

更简单的例子

我知道socket.io文档中的withTimeout示例可能有点难以理解,因此这里有一个不太复杂的示例,基本上也是这样:

app.get('/somethingcool', (req, res) => {
  
  let got_reply = false;
  
  const timeout = setTimeout(() => {
    if (got_reply) { return; }
    got_reply = true;
    res.status(500).send("too late");
  }, 5000);


  socket.emit("do_something_i_will_wait", {}, (reply) => {
    if (got_reply) { return };
    got_reply = true;
    clearTimeout(timeout);
    res.status(200).send(reply);
  });

});

相关问题 更多 >