环境: 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' });
}
使用 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()
.
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句