Express:即使在发送响应后我的代码是否仍然运行?

时间:2017-10-31 18:34:12

标签: javascript express

我的代码基本上是这样的:

return Promise.all([
  myPromise("foo", () => saveToFirebase("foo")),
  myPromise("bar", () => saveToFirebase("bar")),
  ... // 50 more of these ^ 
]).then(() => {
  res.status(200).send('ok');
}).catch(err => {
  console.log(err.stack);
  res.status(500).send('error');
});

我的请求超时,因为我的一些请求需要很长时间。我的问题是:如果我只是在没有链接res.status(200)的情况下拨打Promise.all,即使发送了回复,我的未解决的承诺是否仍会解决?或者,一旦发送了响应,我的代码的所有执行都会停止吗?

像这样:

Promise.all([
  myPromise("foo", () => saveToFirebase("foo")),
  myPromise("bar", () => saveToFirebase("bar")),
  ... // 50 more of these ^ 
])
res.status(200).send('ok');

3 个答案:

答案 0 :(得分:1)

所有承诺将被解决或拒绝。完成请求后,Express不会停止任何执行。您可以通过简单的控制台日志尝试:

Promise.all([
  myPromise("foo", () => saveToFirebase("foo")),
  myPromise("bar", () => saveToFirebase("bar")),
  ... // 50 more of these ^ 
])
.then(() => console.log("promises resolved"))
.catch(err => console.error("promises rejected", err))
res.status(200).send('ok')

但是,使用这种方法,您不知道发送响应时是否出现任何问题。

答案 1 :(得分:1)

承诺将永远执行。在响应发送后,您可以在下面的图片中看到after promise resolve打印在控制台上。

Promise resolve after response is send

您还可以通过将res.shouldKeepAlive设置为true来保持连接的活动:

Promise.all([
        check(2),
        check(2),
        check(2)
    ]).then(() => {
        console.log('after promise resolve');
        setTimeout(function() {
            res.send('done');
        }, 10000);
    });
    console.log('Before promise resolve');
    res.shouldKeepAlive = true;

答案 2 :(得分:0)

或者你可以像这样保持连接:

const keepalive = setInterval(_=>res.write("."),1000);

return Promise.all([
  myPromise("foo", () => saveToFirebase("foo")),
  myPromise("bar", () => saveToFirebase("bar")),
   ... // 50 more of these ^ 
]).then(() => {
  res.status(200).send('ok');
}).catch(err => {
  console.log(err.stack);
  res.status(500).send('error');
}).then(_=>clearInterval(keepalive));