我的代码基本上是这样的:
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');
答案 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
打印在控制台上。
您还可以通过将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));