Loading [MathJax]/jax/input/TeX/config.js
社区首页 >问答首页 >在Node.js中,当路由结束时,是否所有尚未完成的异步代码都停止了?

在Node.js中,当路由结束时,是否所有尚未完成的异步代码都停止了?
EN

Stack Overflow用户
提问于 2020-09-19 19:16:12
回答 1查看 84关注 0票数 0

环境: Node.js,Express

问题:当路由的结束被击中时,是否所有尚未完成的异步代码都停止了?我已经做了几个小时的实验,这似乎是真的,但有一个明确的答案吗?

示例:在下面的简化示例中,当路由被击中时,调用getInfoAndSaveIt。此函数具有一个fetch调用,该调用将是缓慢的,然后是数据库保存,而数据库保存也将是缓慢的。在这个路线上,程序一定会在函数完成之前到达行res.render('homepage');。在本例中,homepage是否呈现尚未完成停止的函数中的所有异步代码?或者,即使路由的末尾已被击中,异步代码是否在后台继续?

代码语言:javascript
代码运行次数:0
复制
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' });
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-19 19:25:45

With Node.js,Express当路由结束时,是否所有尚未完成的异步代码都停止了?

不是的。异步代码有自己的想法,与特定的路由没有直接联系。例如,假设您使用了一些异步代码来进行一些日志记录。发送响应,然后调用一些异步代码来记录一些数据。日志记录将继续进行下去。它与路线没有直接的联系。只是在解释器中运行Javascript。

至于你的例子:

在这种情况下,

会呈现主页和尚未完成停止的函数中的所有异步代码吗?

是的,主页将呈现。异步代码将自行完成。

还是交替的,即使路由的结束已经被击中,异步代码是否在后台继续?

是的,异步代码本身还在继续。

试试这个简单的例子:

代码语言:javascript
代码运行次数:0
复制
app.get('/', function(req, res) {
    setTimeout(() => {
        console.log("timer fired");
    }, 2000);
    res.render('homepage');
    console.log("done rendering page");
});

当您到达此路由时,您将在服务器日志中看到这一点:

代码语言:javascript
代码运行次数:0
复制
done rendering page
timer fired

作为异步操作在路由完成后继续进行的证据。

请记住,在node.js中处理路由只是另一种异步操作。这不是什么神奇的过程或线程的事情。它只是由传入的http请求触发的异步操作。因此,没有什么神奇的属性能够找到由它启动的所有异步操作,并以某种方式杀死它们。这不是node.js的工作方式。正好相反。一旦您启动它们,它们就有了自己的想法,并且不管流程中还在做什么,它们都会完成,除非进程崩溃或您专门调用process.exit()

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63975180

复制
相关文章
探索异步迭代器在 Node.js 中的使用
上一节讲解了迭代器的使用,如果对迭代器还不够了解的可以在回顾下《从理解到实现轻松掌握 ES6 中的迭代器》,目前在 JavaScript 中还没有被默认设定 [Symbol.asyncIterator] 属性的内建对象,但是在 Node.js 中已有部分核心模块(Stream、Events)和一些第三方 NPM 模块(mongodb)已支持 Symbol.asyncIterator 属性。本文也是探索异步迭代器在 Node.js 中的都有哪些使用场景,欢迎留言探讨。
五月君
2020/12/14
7.5K0
探索异步迭代器在 Node.js 中的使用
场景:当所有的 Controller,都需要传入某个参数,代码如何写?
假设有个场景,每一个 controller 都需要接收一个共同的参数,那么除了在每一个方法中都加入这个参数之外,还有一个方法就是使用@ControllerAdvice 注解。
水货程序员
2019/06/11
1.4K0
让所有代码都经过检查
今天谈论 DevOps 这个话题,所以要先来看下代码检查在DevOps中的位置。下面这张图来自于乔梁老师《持续交付》那本书,一个简单的部署流水线示意图,简化表示了软件开发从代码提交、编译构建、代码检查到各种测试最后发布到用户手中的一个自动化过程。
DevOps时代
2018/12/13
8.2K1
让所有代码都经过检查
深入浅析Node.js中的异步
以点菜吃饭为例子:去饭堂点菜吃饭需要排队等待,在这个过程中,阿姨每次只能接待一个人,“点菜-阿姨抖勺装菜-把饭菜给到你”这个过程中阿姨并不能接收其他人的点菜,这个就是阻塞 I/O;而去餐馆点菜吃饭,去到餐馆就可以跟服务员你要吃番茄炒蛋,服务员记下来之后交给后厨,这时候来了另一桌人就把服务员招呼过去说想吃小龙虾,也就是说,在把菜给你上上来之前服务员接收了其他人的点菜,那这个就是非阻塞型 I/O。
conanma
2022/01/05
1.3K0
Node.js 中的异步迭代器
从 Node.js v10.0.0 开始,异步迭代器就出现中了,最近它们在社区中的吸引力越来越大。在本文中,我们将讨论异步迭代器的作用,还将解决它们可能用于什么目的的问题。
疯狂的技术宅
2020/05/11
1.7K0
Node.js 中的异步迭代器
Java获取当日的起始时间,结束时间,现在时间,是否在时间段中。
当日的起始时间 public static Date getTodayStartTime() { Calendar todayStart = Calendar.getInstance(); todayStart.set(Calendar.HOUR_OF_DAY, 0); todayStart.set(Calendar.MINUTE, 0); todayStart.set(Calendar.SECOND, 0); return
ydymz
2018/09/10
2.1K0
Selenium在异步加载中的应用简书文章异步加载Selenium代码代码分析
简书文章异步加载 之前爬虫小分队的第一次作业就是爬取简书七日热门,同学们应该知道部分数据是异步加载的,对于阅读,评论,喜欢的抓取数据策略为使用正则表达式匹配,收录专题就是找包来获取数据的。 Selen
罗罗攀
2018/07/03
1.5K0
RabbitMQ 整合MQTT 尚未完成
RabbitMQ官网介绍MQTT插件使用说明:https://rabbitmq.com/mqtt.html
收心
2022/09/27
6190
RabbitMQ 整合MQTT 尚未完成
Node.js 中的异步生成器和异步迭代
生成器函数在 JavaScript 中的出现早于引入 async/await,这意味着在创建异步生成器(始终返回 Promise 且可以 await 的生成器)的同时,还引入了许多需要注意的事项。
疯狂的技术宅
2020/09/01
1.7K0
Node.js 中的异步生成器和异步迭代
有了libco,异步化都成了小case!
张俊强 腾讯互娱工程师,目前负责腾讯互娱心悦俱乐部的后台开发,先后参与过心悦用户体系下沉,后台服务协程化改造,心悦积分体系搭建等项目,致力于海量、高可用、高性能的分布式系统设计及研发。 改造背景 工作后一直在做c++后台服务开发,框架基本都是多进程多线程的模型,也基本能解决绝大部分问题。不同的应用场景下,可以通过同步或者异步的方式来满足业务或者性能的要求。 但是如果原有业务是同步方式实现的,如果性能需要优化改为异步,一般都是通过重构服务来实现,重构的过程大家都懂的,特别是涉及到整个框架的异步化重构,是很痛苦
腾讯开源
2018/03/02
1.7K0
在 JavaScript 中写好异步代码的14条Linting规则
在JavaScript中调试异步代码有时感觉就像在雷区中导航。 你不知道console.logs会在何时何地打印出来,你也不知道你的代码是如何执行的。
唐志远
2022/10/27
1.4K0
案例和工具都过时了,是否还有学习的必要
在 2019 年,我们把 2017 和 2018 年的文章以年刊的方式整理出来,并对外发布,然后有小伙伴(@Howe-7)在看文章的时候,发现一些问题,如下:
信安之路
2020/01/17
4930
案例和工具都过时了,是否还有学习的必要
如何检测本页中的iframe是否“加载”完成
这其实是上一篇"iframe框架取值兼容ie/firefox/chrome的写法"的扩展应用: 应用场景:iframe个人感觉最独特的应用之一就是配合P3P协议可以实现跨域写入cookie(好象除此之外,还没找到更有效的办法),但是有时候我们不知道这个iframe页面是否执行完毕,有没有办法判断iframe里的页面是否load完成了呢? iframe1.html: <html> <head> <title>框架内页</title> </head> <body> <div> <input id="txt
菩提树下的杨过
2018/01/23
3.6K0
为什么几乎所有的开源数据库中间件都是国内公司开源的?并且几乎都停止了更新?
开源社区的建设是一个长期的过程,不仅仅是把源码开放这么简单的事情,从目前的阶段看开源在国内全面的兴起还是需要一段时间,就拿数据库的中间件软件社区,之所以在国内能够兴盛一段时间根本的原因在于国内强大的内需市场,国内数据库的存储访问量几千万甚至上亿也是司空见惯的事情,特别是国内互联网行业快速的发展,高负载的数据库中间件也是应运而上,在早期得到很大一部分的人认可,但是随着大家在这块都有足够的积累之后慢慢这块的热度已经在慢慢下降了,现在很多企业都掌握了这个技术。
程序员互动联盟
2020/07/28
7920
为什么几乎所有的开源数据库中间件都是国内公司开源的?并且几乎都停止了更新?
模块化
在nodejs中,可以通过exports或module.exports 和 require 实现模块化 exports 和 module.exports的区别? exports曝光内容必须添加属性 module.exports曝光内容,可以添加属性,也可不添加属性
河湾欢儿
2018/09/06
1.8K0
Node.js 路由
我们要为路由提供请求的 URL 和其他需要的 GET 及 POST 参数,随后路由需要根据这些数据来执行相应的代码。
陈不成i
2021/07/12
2.2K0
代码完成到上线经历了什么
前端工程化,是面向公司的代码模块化、系统化、规范化的一个过程,在这个过程中,经过了这个过程,我们才能称得上是“正规军”。
不作声
2021/03/05
7010
代码完成到上线经历了什么
异步编程 - 07 基于JDK中的Future实现异步编程(下)_当Stream遇见CompletableFuture
JDK8中提供了流式对数据进行处理的功能,它的出现允许我们以声明式方式对数据集合进行处理。所谓声明式是相对于我们平时所用的命令式编程来说的,使用声明式编程会让我们对业务的表达更清晰。另外使用流可以让我们很方便地对数据集进行并行处理。
小小工匠
2023/09/09
3480
一步完成在Mac机器上部署、运行和停止ZooKeeper
ZooKeeper 一个中心化的服务, 用于维护配置信息, 命名服务(naming), 提供分布式同步和集群服务(group services)。
谙忆
2021/12/29
1.3K0
一步完成在Mac机器上部署、运行和停止ZooKeeper
Node.js异步编程
1. 同步API,异步API //路径拼接 const public = path.join(_ dirname, 'public') ; //通过返回值拿到 //请求地址解析 const url0bj = url. parse (req. ur1) ; //通过返回值拿到 //读取文件 fs. readFile(' ./demo.txt', 'utf8', (err, result) => { console .1og (result) ; }) ; //通过函数方式拿到 同步API:只有当前
清出于兰
2020/10/29
1.9K0
Node.js异步编程

相似问题

当所有的异步方法都完成时,C#添加异步方法的结果

12

当user.csv中的所有用户都完成时,停止users测试

26

当不同演示程序中的所有异步方法都完成时,更新UI状态

12

当向量中的所有值都小于10^-8时,要求代码停止

11

当RecylerView中的所有onCreateViewHolder都完成时通知

13
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文