环境: Node.js,Express
问题:当路由的结束被击中时,是否所有尚未完成的异步代码都停止了?我已经做了几个小时的实验,这似乎是真的,但有一个明确的答案吗?
示例:在下面的简化示例中,当路由被击中时,调用getInfoAndSaveIt
。此函数具有一个fetch调用,该调用将是缓慢的,然后是数据库保存,而数据库保存也将是缓慢的。在这个路线上,程序一定会在函数完成之前到达行res.render('homepage');
。在本例中,homepage
是否呈现尚未完成停止的函数中的所有异步代码?或者,即使路由的末尾已被击中,异步代码是否在后台继续?
app.get('/', function(req, res) {
getInfoAndSaveIt();
res.render('homepage');
});
function getInfoAndSaveIt() {
let randomData = fetch('https://www.example.com/data.txt');
User.updateOne({ data: randomData }, { id: 'abc123' });
}
发布于 2020-09-19 19:25:45
With Node.js,Express当路由结束时,是否所有尚未完成的异步代码都停止了?
不是的。异步代码有自己的想法,与特定的路由没有直接联系。例如,假设您使用了一些异步代码来进行一些日志记录。发送响应,然后调用一些异步代码来记录一些数据。日志记录将继续进行下去。它与路线没有直接的联系。只是在解释器中运行Javascript。
至于你的例子:
在这种情况下,
会呈现主页和尚未完成停止的函数中的所有异步代码吗?
是的,主页将呈现。异步代码将自行完成。
还是交替的,即使路由的结束已经被击中,异步代码是否在后台继续?
是的,异步代码本身还在继续。
试试这个简单的例子:
app.get('/', function(req, res) {
setTimeout(() => {
console.log("timer fired");
}, 2000);
res.render('homepage');
console.log("done rendering page");
});
当您到达此路由时,您将在服务器日志中看到这一点:
done rendering page
timer fired
作为异步操作在路由完成后继续进行的证据。
请记住,在node.js中处理路由只是另一种异步操作。这不是什么神奇的过程或线程的事情。它只是由传入的http请求触发的异步操作。因此,没有什么神奇的属性能够找到由它启动的所有异步操作,并以某种方式杀死它们。这不是node.js的工作方式。正好相反。一旦您启动它们,它们就有了自己的想法,并且不管流程中还在做什么,它们都会完成,除非进程崩溃或您专门调用process.exit()
。
https://stackoverflow.com/questions/63975180
复制相似问题