【问题标题】:Non-block setTimeout for web serverWeb 服务器的非阻塞 setTimeout
【发布时间】:2023-06-11 21:02:01
【问题描述】:

我有一个网络服务器,可根据请求拨打电话,等待 3 秒,然后检查该电话是否仍在进行中。我使用setTimeout 来集成它,但这会阻止与 Web 服务器的所有其他连接,直到超时完成。

// example get request
app.get("/", function(req, res) {
  // take an action
  example.makeCall(function() {
    setTimeout(function() {
      // check the action
      example.checkCall(function() {
        res.status(200)
      })
    }, 3000)
  })
})

是否有其他方法可以在不阻塞所有其他传入请求的情况下为请求添加超时?

【问题讨论】:

  • 不。 setTimeout 没有阻塞。
  • 它不应该阻塞网络服务器。是什么让你这么认为?
  • 正是你如何实现它使它“看起来”被阻止了。请改用 setInterval,如果您获得所需的状态,请继续。

标签: javascript http express web timeout


【解决方案1】:

不确定您的其他 API 请求为何被阻止,新的 API 请求应在调用堆栈上使用路由回调函数的新调用,并且不应依赖于完成添加到调用堆栈的先前回调函数。

问题可能不是 setTimeout 被阻塞,而可能是另一个问题,例如您的电话 API 阻止了在前一个呼叫完成之前进行的新呼叫。

但可以尝试的方法是等待 3 秒以尝试绕过潜在的阻塞。

function waitThree() {
  return new Promise(function(resolve) {
    setTimeout(function() {
      resolve();
    }, 3000);
  });
}

app.get("/", function(req, res) {
  // take an action
  example.makeCall(function() {
    waitThree.then(function() {
      example.checkCall(function() {
        res.status(200)
      });
    });
  })
});

【讨论】: