循环会停止ExpressJS上路由的执行,直到它完成,这可能会在浏览器中产生超时。
在这个例子中,显示网站大约需要10秒(我需要执行睡眠功能),但我希望你继续在后台运行,路线将立即显示
有什么建议吗?
app.get('/', function(req, res) {
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
let array = [1,2,3,4,5,6,7,8,9]
for (const a of array) {
console.log(a)
await sleep(1000);
}
res.send('hello world');
});
如果希望立即发送响应,请将res.send()
放在循环之前。您仍然可以在发送响应后运行代码——该代码不能参与计算响应,因为它已经发送。
app.get('/', function(req, res) {
res.send('hello world');
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
let array = [1,2,3,4,5,6,7,8,9]
for (const a of array) {
console.log(a)
await sleep(1000);
}
});
删除for循环中的await关键字。wait关键字基本上会停止代码的执行,直到当前Promise得到解决,所以如果你不等待它,它会与其他代码一起运行。您的响应在不到一秒钟的时间内返回,而节点进程在后台中解析睡眠承诺
app.get('/', function(req, res) {
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
let array = [1,2,3,4,5,6,7,8,9]
for (const a of array) {
console.log(a)
// await sleep(1000);
sleep(1000);
}
res.send('hello world');
});