用一个小例子,来分析nodejs的异步调用的顺序

JS案例:实现一个简单的任务队列-TaskQueue 针对一些大型的秒杀活动,抢票业务,高并发是一个经常遇到的问题,后端人员时常会接触到消息队列这个中间件。对于前端人员而言,使用node开发业务,或者使用浏览器单线程异步渲染时也会遇到堵塞,页面卡死的现象,如何处理大量的数据同时加载或者数据同时请求便成为了老生常谈的话题。 此时一个异步的任务队列或许可以帮助我们缓解这些问题。 任务队列的特点:异步,解耦,削峰异步是多个任务并发进行,互不依赖;解耦是将业务隔离开,保证任务的运行结果不会影响到其他任务,从而产生堵塞;削峰是指在系统请求量或者负载达到一定峰值时使用缓存 阅读详情

通过同步和异步的对比,我们来看下nodejs是如何处理一些异步调用的。

下面是nodejs代码:

'use strict';
const fs = require('fs');

// 模拟异步
console.time('setout');
setTimeout(function(){
  console.timeEnd('setout');
},0);
setImmediate(function(){
    console.log('setImmediate');
})
process.nextTick(function(){
    console.log('process.nextTick');
})

// 用于阻塞主线程
for(var i=0;i<10000000;i++){}
console.log('for循环之后');

// 异步读取文件
fs.readFile('./1.txt','utf8',function(err,data){
    if(err){
        return console.log('读取错误啦');
    }
    fs.writeFile('./11.txt',data,'utf8',function(err){
        if(err){
             return console.log('写入错误啦');
        }
        console.log('异步读取完成');
    })
})

// 同步读取文件
fs.readFileSync('./1.txt');
console.log('同步读取文件结束');

其执行结果是:

for循环之后
同步读取文件结束
process.nextTick
setout: 15.483ms
setImmediate
异步读取完成

总结:

虽然代码是从上到下依次执行,但是遇到有异步操作的时候,就会把异步操作放入事件队列中进行事件循环。同步操作会在主线程上进行,虽然同步读取文件被放到了代码的最后,但是从结果看还是提前执行。
同时,异步中的 process.nextTick() 操作,优先级最高,它会优先被执行。

NodeJS 异步操作:事件队列的有序与并发操作 在上一节中我们介绍了NodeJS基础的异步回调实现方法,实现了异步的递归函数摆脱了‘回调地狱’。最后引入了Promise 特性将异步回调实现地更加优雅。 然而基于Promise的链式调用方法目前看似只能实现硬编码。基于上一节的问题,我们有一个文件列表,需要顺次读取其中的内容并打印。在这里我们引入es7的 Async 和 Await 关键字。 先实现一个简单的例子,在暂停5秒后在控制台输出endc 阅读详情

相关推荐

tkinter使用label视频播放

tkinter是python的界面开发包 使用tkinter显示视频流的一个办法是使用label来逐帧显示图片。 from Tkinter import * from PIL import ImageTk, Image import cv2 root = Tk() # Create a frame app = Frame(root, bg="white") app.grid() # Create a label in the frame lmian = Label(app) lmain.grid(

六十英里的专栏 5526

Node笔记

执行顺序:先执行同步代码,遇到异步宏任务则将异步宏任务放入宏任务队列中,遇到异步微任务则将异步微任务放入微任务队列中,当所有同步代码执行完毕后,再将异步微任务从队列中调入主线程执行,微任务执行完毕后再将异步宏任务从队列中调入主线程执行,一直循环直至所有任务执行完毕。(5)先执行同步再执行异步,异步遇到微任务,先执行微任务,执行完后如果没有微任务,就执行下一个宏任务,如果有微任务,就按顺序一个一个执行微任务。实际上是先执行同步任务然后在执行异步任务,异步任务是分宏任务和微任务两种的。

xiaomu6的博客 309

WorkBuddy结合DeepSeek与Skill:文献检索自动化与Token成本控制实战

Agent工具与大模型API的结合正重塑知识工作者的日常流程。在实际工程中,调用大模型处理批量任务常面临Token消耗过快、成本不可控的痛点,而国产大模型DeepSeek以极低的API定价和兼容OpenAI接口的特性,为规模化文本处理提供了“Token自由”的可能。同时,可复用的Skill机制能够将特定领域的工作流固化为标准化步骤,让Agent自动执行检索式生成、文献筛选与摘要归纳等复杂操作。本文从这一技术背景出发,以科研文献检索为应用场景,演示如何利用WorkBuddy、DeepSeek API与自建文献

weixin_29061509的博客 486

Node.js 异步编程(附几个小练习题学会分析代码执行顺序)

介绍了同步API和异步API,Node.js中的异步API有哪些,举例解释了如何利用回调函数获取异步操作的结果,并有几个例题来分析代码执行顺序

weixin_47505105的博客 947

AI Agent ReAct架构设计模型剖析

ReAct通过"思考-行动-观察"循环运作:智能体先进行自然语言推理,再调用外部工具执行行动,观察结果后继续推理直至解决问题。这种架构提高了透明度和准确性,减少幻觉风险,使LLM能主动分解任务并利用外部数据源。实现关键在于精心设计的提示模板,引导LLM按结构化格式响应,而非依赖模型固有能力。

weixin_43939320的博客 1250

Chamfer Loss

ChamferLoss是一种常用于3D点云(pointcloud)处理的损失函数,特别是在点云生成和对齐任务中。它的目的是度量两个点集之间的相似度,特别是在点云重建、配准或生成等任务中,常用于优化模型使得生成的点云更接近真实的点云。

夜空中明亮的星的专栏 455

Nodejs使用队列(以截图网址对应页面为例)

Nodejs使用队列(以截图网址对应页面为例)

weixin_68658847的博客 617

【OpenClaw从入门到精通】:Web控制台使用全解析——可视化配置与监控(2026实操版)

在OpenClaw的多种管理方式中,Web控制台提供了最直观、最友好的用户体验。通过图形化界面,用户可以轻松完成复杂的配置任务,实时监控系统状态,以及进行各种管理操作。对于不熟悉命令行的用户来说,Web控制台是最佳选择。

一键难忘的博客 1926

Nodejs + Redis = MQ(简易消息队列实现)

从零到一 用nodejs 手写一个简易的消息队列,手把手教学。emm 如果还是不会 ,去仓库拿吧 😝

赵忠洋的博客 1811

Openlayers 教程 02 - 地图添加 WKT WKB GeoJson 格式的点线面数据

WebGIS 开发中,对于数据量不是很大的场景,可以直接从数据库读取数据,通过创建点线面要素(Feature),然后添加到矢量图层(vectorLayer)中,在地图上展示。添加点线面的方法可以封装一下,方便使用。...

非科班Java出身GISer的博客 3854

CloudCompare 二次开发(16)——计算点云最值

不依赖任何第三方点云相关库,使用ClopudCompare计算点云最值。

点云侠的博客 517

nodejs中for循环和异步调用的那些坑

在nodejs中for循环中是不能嵌套使用异步调用的,就像下面的: 我们定义一个post请求,用于接受前端发送来的文件,然后使用for循环对目录下的一些文件依次做一些异步调用事情(使用fs的stat) router.post('/uploadfile', function (req, res) {     upload(req, res, function (err) {

u012631731的博客 1万+

ABAP CDS Time Functions 全面解析:用 TIMS_IS_VALID 护航时刻字段的正确性

摘要:本文深入解析ABAP CDS时间函数TIMS_IS_VALID的应用,重点介绍其在企业系统时间字段校验中的关键作用。文章指出无效时间数据会导致业务流程混乱,而CDS层校验能有效减少重复逻辑。详细说明TIMS类型格式要求、空值处理规则,并提供两种工程实现方案:在CDS视图中直接派生校验列,或通过ABAP SQL在内存表中批量验证。最后给出可直接运行的代码示例,包括一个ABAP报表演示内存表验证,以及一个CDS View Entity实现系统时间自动映射与校验,帮助开发者在业务场景中快速落地时间校验功能。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 193

python nodejs混合_异步调用nodejs和python - javascript

大家我想在节点脚本中异步调用python脚本。我为此使用“ python-shell”。我的问题是节点首先执行自己的代码,然后执行python脚本。我在运行时需要python脚本数据。这意味着:let {PythonShell} = require('python-shell');let message;PythonShell.run('python.py',null,function(err,r...

weixin_39821718的博客 293

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

nodejs 按顺序异步调用

var arr = [], slice = arr.slice, AsyncCallback = function() { this.init.apply(this, arguments); }; AsyncCallback.prototype = { constructor : AsyncCallback, init : function() { this.__list

fengwusan的专栏 2360

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

NodeJS的模块系统

A、CommonJS是一套代码规范,目的是为了构建JavaScript在浏览器之外的生态系统(服务器端,桌面端)B、CommonJS的主要内容a、模块必须通过module.exports导出对外的变量或接口b、通过require()来导入其他模块的输出到当前模块作用域中(模块一般在文件的顶部导入)。...

Yannick_H的博客 1217

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Nodejs的事件循环

Nodejs的事件循环

太阳与星辰的博客 1037

【Sqlite3】【Nodejs 】

serialize可保证回调函数中的代码顺序执行,但其中的代码若是异步调用,其不能将异步调用变为同步调用!执行的顺序是:00000==>22222==>44444==>11111=>33333。上面是封装的sqlite 这里就可以使用了。最近在使用 Sqlite 小记一下。......

weixin_42910765的博客 1179

nodejs--事件环、宏任务和微任务

目录 一、事件环 1.1 初识事件环 1.2 NodeJS事件环和浏览器事件环区别 1.3 NodeJS中的任务队列 1.4 其他 二、宏任务和微任务 2.1 初识宏任务和微任务 2.2 宏任务和微任务 2.3 常见的宏任务和微任务 2.4 注意点: 一、事件环 1.1 初识事件环 和浏览器中一样NodeJS中也有事件环(EventLoop),但是由于执行代码的宿主环境和应用场景不同,所以两者的事件环也有所不同 1.2 NodeJS事件环和浏览器事件环区别 ...

小白小白从不日别的博客 1832

Nodejs I/O异步和事件循环

1、代码依次执行,打印‘start’,setTimeout为宏任务,放入异步队列,立即执行promiseA,打印’promise executor’,.then为微任务,放入异步队列,向下执行打印’end’,同步执行完成。1、从上至下依次执行,打印‘start’,执行new Promise,打印’promise executor’,resolve()注册.then,放入微任务队列,向下执行打印’end’,同步执行完成。需要等待前面的任务执行完,才能向后执行,这样会造成任务阻塞,体验不友好。

weixin_44862629的博客 1174

nodejs的require加载模块的路径搜索顺序说明

nodejs的require加载模块的路径搜索顺序,非核心模块,node_modules(遍历至根目录) -> NODE_PATH目录 -> 全局目录,如果传递给 require() 的模块标识符不是一个核心模块,也没有以 '/' 、 '../' 或 './' 开头,则 Node.js 会从当前模块的父目录开始,尝试从它的 ./node_modules 目录里加载模块

白袍小将的博客 2582

深入理解NodeJS事件循环机制

导读 ALL THE TIME,我们写的的大部分javascript代码都是在浏览器环境下编译运行的,因此可能我们对浏览器的事件循环机制了解比Node.JS的事件循环更深入一些,但是最近写开始深入NodeJS学习的时候,发现NodeJS的事件循环机制和浏览器端有很大的区别,特此记录来深入的学习了下,以帮助自己及小伙伴们忘记后查阅及理解。 ...

小青蛙的博客 1413

nodejs顺序执行shell

最近工作中需要用到nodejs编写脚本来顺序执行自动化测试用例,编写代码如下: var runCommand = function (command){ child_process.exec(command,function (error, stdout, stderr) { if (stdout !== null) { console.log('exe...

weixin_30662011的博客 394

谈谈NodeJS异步

同步与异步 一谈起Node,了解过的人会想起是利用异步IO实现高性能后台,那么什么是异步IO呢? 异步IO与同步IO的区别是什么呢?举个例子:在生活中,大家每天都会用到微信来进行聊天。那么某个时间有两个人来跟你聊天,同步与异步会有不同的表现(单线程的情况下)。 同步:同步的做法是先选择一个比较先与你聊天的,把整个天都给聊完了,最后确定对方与你没有什么好聊的。ok接下去跟另外一个人进行聊天。 异步...

Ancecis的博客 3778

NodeJs中的事件循环

在上期发表的博客中,我们详细讲述了一下JavaScript中的事件循环,我突然又想起来,NodeJS也是基于JavaScript语言的一种后台语言。那么他的事件循环跟Javascript中的事件循环有什么相同点又要什么区别呢?今天我们带着这样的疑问也来看看nodejs中的事件循环吧! 1.事件循环 如上图,大概就是nodejs中的事件循环基本流程。在进入后判断代码是否都为同步代码,如果都为同步代码,则不进入事件循环,直接结束。如果有异步代码,会进入相应的流程队列中。现在就让我们来介绍一下No..

spech1ess的博客 582

一个前端工程师眼里的NodeJS

JavaScript单线程的误解   在我接触JavaScript(无论浏览器还是NodeJS)的时间里,总是遇到有朋友有多线程的需求。而在NodeJS方面,有朋友甚至直接说到,NodeJS是单线程的,无法很好的利用多核CPU。   诚然,在前端的浏览器中,由于前端的JavaScript与UI占据同一线程,执行JavaScript确实为UI响应造成了一定程度上的麻烦。但是,除非用到超...

dfl2099的博客 127
上一篇: Angular中的内置指令和自定义指令
下一篇: javascript中严格模式中的作用域问题
Wang's Blog
博客等级 码龄12年 7418粉丝 2402原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wang's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值