详解JavaScript异步执行顺序

JS中异步处理执行顺序 本文对JS执行做一个扩展。JavaScript是单线程语言,同一时间只能做一件事,只有当前一个任务结束,才会执行下一个任务。假如前一个任务执行时间较长,下一个任务还得等待前一个任务执行完成。在JS中有同步任务和异步任务,他们之间的执行有一定的顺序。 阅读详情

单线程的JavaScript

正如我们所知,JavaScript是一个单线程的语言,之所以是单线程的,和其用途有关。我们知道,JavaScript主要是和用户交互的,那么如果JavaScript是多线程的,在操作DOM的时候,一个线程对DOM节点进行操作,而另一个线程删除DOM节点,那该按哪个线程的操作为准,为了避免这个问题,JavaScript被设计为单线程(实际上是正因为JavaScript的单线程特点,才可以被做为网页脚本使用)

JavaScript中的任务执行

说完JavaScript为什么是单线程的,我们来说说JavaScript里面是如何运行的
虽然JavaScript是单线程的,但是浏览器却是多线程的,一般来说,我们将执行我们同步任务代码的线程称为主线程
我们知道,在JavaScript中有同步任务和异步任务,对于同步任务,在经过预编译后,会放在主线程中,形成一个执行栈,按顺序从上往下执行,而对于异步任务,会在异步调用的时候,被放入到任务队列中,当执行栈的任务执行完毕后,就将任务队列中的任务依次取出放到执行栈中执行,如此往复执行所有任务,这个过程叫做event loop
看看下面的这道题目

console.log(1)
setTimeout(function(){
    console.log(3)
},0)
console.log(2)

如果理解了上面的内容,就会明白为什么这里的输出顺序是123。
在运行这段代码的时候,首先会将console.log(1)放入主线程,然后看到setTimeout,延迟时间是0s也即是当下(实际上在html5规范中小于4ms都变成4ms,但这不会影响本题答案),将console.log(3)放入到任务队列中,然后将console.log(2)放入到主线程中,按顺序执行

console.log(1)
console.log(2)

然后此时,主线程中的任务已经执行完毕了,查看任务队列,发现还有个console.log(3)还没有执行,于是执行console.log(3)

异步任务过程详解

上面提及了,在我们遇到异步任务的时候,我们将console.log(3)放入了任务队列了,那么这段代码是什么呢,实际上是一段回调函数,有没有发现,任何异步的操作,最后都需要有一个回调函数。为什么?因为如果没有回调函数的话,我怎么知道这个异步操作完成了,所以回调函数其中一个作用就是告诉主线程异步操作已经完成
一般情况下,我们会遇到以下几种异步操作

  1. click,mousemove,keydown等这些操作
  2. 加载事件,load
  3. 定时器,setTimeout,setInterval
  4. promise的状态发生改变
  5. 发送异步请求等待响应到来

一个完整的异步操作,包括注册事件和等待事件被触发
一开始,在执行时遇到异步操作,首先是主线程发起一个异步的请求,注册这个异步事件,异步任务接收到后告知主线程已经收到,然后主线程继续执行,在此同时,异步事件如果被触发,就会将相应的回调函数放到任务队列中,然后等到主线程中的任务执行完毕后,就会查看任务队列,将这些任务拿到执行栈执行。

微任务和宏任务

实际上,异步任务也被分为微任务和宏任务,这两种任务在最直观的区别在于优先级
如上文所说,当我们在执行栈中将同步任务执行完了之后,我们会去查看任务队列中的任务,首先查看的是微任务,如果有微任务,将其拿到执行栈中执行,如果没有,则去查看宏任务,做一样的操作
从上面的流程看出,微任务的优先级是大于宏任务的

而从这两个任务的命令角度,可以有另一种也是比较准确的理解,我们可以将任务队列中存在的任务也看出宏任务,而宏与微,实际上就是大和小的区别,微任务的存在,是为了能够在两个花费时间长的宏任务之间,去处理一些微小的任务,所以,实际上我们是在处理完任务队列中的任务后,在执行下一个宏任务之前,查看当前是否有微任务,如果有,就利用这个间隙去执行微任务,等到微任务都执行完了,再去执行下一个宏任务

因此,即使同时有多个宏任务被加入队列中,在这些宏任务之间切换时,也要去看微任务队列中是否有微任务,如果有的话就要先执行这些微任务

微任务

  • promise

宏任务

  • setTimeout
  • setInterval
  • xhr请求

知道了上面这个知识点,下面这道题目就能正确地做出来了

setTimeout(()=>{
    console.log(1)
},0)
new Promise(resolve=>{
    console.log(2)
    resolve()
}).then(()=>{
    console.log(3)
})
console.log(4)

这里的答案是2431

  1. 遇到setTimeout,注册定时器事件,在0s(按规范是4ms,这里就先当做0s吧)后,即现在将()=>{console.log(1)}推到异步任务中的宏任务
  2. 新建一个promise,执行console.log(2),在这里输出第一个数字2,然后触发resolve,将()=>{console.log(3)}推到异步任务中的微任务
  3. 遇到console.log(4),输出数字4,这是第二个数字
  4. 主线程的内容执行完了,接下来去异步任务里查看,首先查看微任务,发现了微任务中的()=>{console.log(3)},将其放到主线程中的执行栈中执行,输出3,这是第三个数字
  5. 微任务中已经没有别的任务了,此时去查看宏任务,发现了宏任务中的()=>{console.log(1)},输出1,这是最后一个数字1
JavaScript脚本执行顺序与异步处理全解 词法作用域(Lexical Scope)是JavaScript中作用域的一种类型,它决定了变量和函数的作用范围。词法作用域的核心思想是:函数的作用域在函数定义时就决定了,而不是在函数调用时决定的。词法作用域有以下几个特点:静态作用域:作用域是根据源代码中的位置决定的,与函数在哪里被调用无关。嵌套作用域:内部函数可以访问外部函数的变量,反之则不行。引用变量:函数访问变量时,会优先在当前作用域内寻找,如果未找到,则向上级作用域链查找。 阅读详情

相关推荐

RT-Thread网络编程:基于STM32F407的TCP客户端实现(含完整代码解析)

本文详细介绍了在STM32F407平台上,基于RT-Thread操作系统和LWIP协议栈实现工业级可靠TCP客户端的完整过程。内容涵盖底层ETH驱动配置、Socket编程、连接保活与断线重连机制、数据收发协议设计以及资源管理,提供了可应用于实际项目的健壮代码框架与调试技巧。

weixin_29184371的博客 492

为什么 JavaScript 代码执行顺序错乱?

JavaScript 是一种单线程语言,也就是说,它一次只能执行一个任务。这是 JavaScript 执行顺序错乱的根本原因之一。虽然 JavaScript 是单线程的,但它通过事件循环(Event Loop)和异步编程,能够在执行一个任务时同时等待其他任务完成,避免阻塞主线程。JavaScript 的代码执行顺序可能让初学者感到困惑,尤其是在涉及异步操作时。理解事件循环执行栈和任务队列的机制,能帮助你更好地掌握代码执行顺序。

向着太阳迎着光 1264

WinCC与施耐德PLC的Modbus TCP通信实战指南

本文详细解析了西门子WinCC与施耐德PLC通过Modbus TCP协议实现通信的完整实战流程。内容涵盖硬件网络配置、Modbus地址映射核心规则、WinCC驱动连接建立、变量创建及高级数据访问技巧,并提供了常见故障排查思路,帮助工程师高效解决跨品牌设备通信难题。

weixin_29194693的博客 1001

JS中含有异步操作的执行顺序

看下面这个简单的例子,我们将会了解到JS异步操作的体现: setTimeout(function(){ console.log(9); },0); //设置一个定时器 console.log(5); 这段代码的输出顺序是什么? 如果你的答案是9,5.那么有点遗憾,输出顺序是5,9. Why? 在Javascript引擎线程中,存在着一个主线程和一个任务队列,同步任务会在其主线程中执行,而一...

zhang1339435196的博客 2427

基于注意力机制的行人重识别(Reld)模型论文解读----Relation-Aware Global Attention for Person Re-identification

任务概述:在多摄像头的复杂场景中,快速定位查找指定目标的所有结果。

qq_52053775的博客 1895

ADS基础教程16 - 存档和导入(workspace、cell、view)

选择workspace_Archive目录作为保存workspace归档的目录,点击打开进行目录选择,点击Finish保存目录。,选择cell_Archive目录作为保存cell归档的目录,点击打开进行目录选择,点击Finish保存目录。,选择view_Archive目录作为保存view归档的目录,点击打开进行目录选择,点击Finish保存目录。(2)在弹框中,可以选择点击Select将参考的条目添加进来,然后点击Next…(2)在弹框中,可以选择点击Select将参考的条目添加进来,然后点击Next…

XZ_ZC的博客 3702

超硬核五千字!彻底讲明白JavaScript中的异步和同步,以及JavaScript代码执行顺序

同步操作和异步操作是编程中处理任务的两种不同方式,它们主要区别在于控制流和对程序执行的影响。不知道大家是怎么理解JavaScript中的同步和异步的?JavaScript的代码执行顺序是怎么样?下面这段代码是同步还是异步的?

Yong.Sunshine 3226

uniapp [安卓苹果App端] - errMsg“: “request:fail abort statusCode:-1 不支持的URL(-1002)Uniapp真机运行APP网络请求报错失败排查

uniapp真机运行APP,网络请求报错errMsg“: “request:fail abort statusCode:-1 不支持的URL(-1002),uni.request网路请求报错,uniApp解决请求接口报错,uniapp app端打包上线后请求报错,真机运行测试请求失败,uniapp安卓app请求报错,uniapp苹果ios平台网络请求报错,uniapp真机预览请求失败怎么办,不是跨域问题,在H5中请求可以正常发送和接收,但在真机APP上请求报错,Hbuilder真机运行app网络请求报错,全

🏆 前端领域优质创作者 3087

JAVA中主线程等待异步子线程全部执行完后在执行方法(咋个办呢 zgbn)

JAVA中主线程等待异步子线程全部执行完后在执行方法(线程池实现方法)   1、通过 ExecutorService executor = Executors.newCachedThreadPool();   创建执行线程池; 2、构造 Worker 类去实现Runnable接口,并在构造器中追加线程计数器CountDownLatch成员属性; public class W...

咋个办呢 zgbn 3137

ESP32设备驱动-MLX90393磁场传感器驱动

MLX90393 磁场传感器可以在运行时重新编程为不同的模式和不同的设置。 该传感器使用 Melexis 专有的 Triaxis® 技术提供与沿 XYZ 轴感应的磁通密度成比例的 16 位输出,还提供温度输出信号。 这些数字值可通过 I2C 和 SPI 获得,其中 MLX90393 是总线上的从设备。

视觉与物联智能 2350

【100%通过率】华为OD机试真题 JavaScript 实现【对称美学】【2023 Q1 | 100分】

对称就是最大的美学,现有一道关于对称字符串的美学。 已知: 第1个字符串:R 第2个字符串:BR 第3个字符串:RBBR 第4个字符串:BRRBRBBR 第5个字符串:RBBRBRRBBRRBRBBR相信你已经发现规律了,没错! 就是第i个字符串=第i-1号字符串的取反+第i-1号字符串。取反即(R->B,B->R); 现在告诉你n和k,让你求得第n个字符串的第k个字符是多少。(k的编号从0开始)

MISAYAONE的博客 9850

循环中需要调用异步怎么确保执行完再执行其他的_详解JavaScript的任务、微任务、队列以及代码执行顺序

摘要: 理解JS的执行顺序。作者:前端小智原文:详解JavaScript的任务、微任务、队列以及代码执行顺序思考下面 JavaScript 代码:console控制台打印的顺序是怎样的?答案正确的答案是:script start, script end, promise1, promise2, setTimeout,但是由于浏览器实现支持不同导致结果也不一致。Microsoft Edge、Fire...

weixin_39870150的博客 546

有趣的方式学习DDR5(4)—— DDR5 SDRAM 启动与初始化过程全攻略

🟢。

weixin_43199439的博客 1623

JavaScript 执行机制详解

同步任务 → 微任务队列(全部) → 宏任务队列(一个)→ 循环。

m0_75107803的博客 518

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

JS异步执行机制揭秘:事件循环与Promise/setTimeout执行顺序详解

但要是处理复杂业务,比如先调接口拿用户信息,再拿用户订单,再根据订单查物流,async/await 绝对是最优解,代码逻辑清晰,后期改起来也省事。但异步不一样,它是 “拿号排队”—— 比如你去银行办业务,拿了号先去旁边买杯咖啡,等叫到号再回来处理,这样就不用傻站着浪费时间。Promise 就像个 “任务管家”,你把要做的异步任务交给它,它会告诉你任务是成功了还是失败了,还能链式调用,不用再嵌套。毕竟如果 JS 是同步的,一个接口请求要等 3 秒,整个页面就会卡住 3 秒,用户点啥都没反应,这体验也太差了。

思索的涟漪,突破自我 340

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

setTimeout和setImmediate到底谁先执行,本文让你彻底理解Event Loop

笔者以前面试的时候经常遇到写一堆setTimeout,setImmediate来问哪个先执行。本文主要就是来讲这个问题的,但是不是简单的讲讲哪个先,哪个后。笼统的知道setImmediate比setTimeout(fn, 0)先执行是不够的,因为有些情况下setTimeout(fn, 0)是会比setImmediate先执行的。要彻底搞明白这个问题,我们需要系统的学习JS的异步机制和底层原理。本文就会从异步基本概念出发,一直讲到Event Loop的底层原理,让你彻底搞懂setTimeout,setImme

飞翔的熊blabla 2506

JavaScript事件循环详解:深入理解同步异步执行顺序(含8个实战案例)

掌握JavaScript执行机制的关键,本文结合javascript基础教程深入解析事件循环原理,涵盖宏任务、微任务执行顺序及8个典型应用场景。通过实战案例透彻理解异步编程核心逻辑,前端开发必读,值得收藏。

DevPath的博客 632

JS【详解】在浏览器中 JS 代码的执行顺序(含异步机制、同步任务、异步任务、宏任务、微任务、Event Loop)

js 的同步任务和异步任务 js代码可以分为两种任务: 同步任务(synchronous)—— 在主线程上排队执行的任务,只有前一个任务执行完毕,才能执行后一个任务; 异步任务(asynchronous)—— 不进入主线程、而进入"任务队列"(task queue)的任务,只有"任务队列"通知主线程,某个异步任务可以执行了,该任务才会进入主线程执行。 异步任务又分为宏任务与微任务: 宏任务(macrotask ) 事件/函数 浏览器环境 Node.js环境 I/O ✅ ✅ .

朝阳39的博客 899

同步,异步代码区别? ----解决异步的执行顺序

异步代码:这种代码不会阻塞后续代码的执行,异步操作会在完成时通过回调函数,async,await等记住通知相关代码片段来处理结果。函数外部的“后面代码”会立即执行(因为 async 函数是非阻塞的)await 暂停的是 async 函数内部 await 之后的代码。同步代码:每一步操作都必须等待前一步操作完成后再继续执行。主要区别在于执行顺序和阻塞行为。

2302_79917171的博客 57

javascript 事件循环、任务执行顺序

javascript 事件循环 可以先来看这样的一段代码, 可以思考下会输出什么结果: console.log('event start') setTimeout(function () { console.log('setTimeout'); }); new Promise(function(resolve,reject){ console.log('promise start...

chelflan's blog 2087

JavaScript 执行机制

1.关于javascript javascript是一门单线程语言,在最新的HTML5中提出了Web-Worker,但javascript是单线程这一核心仍未改变。所以一切javascript版的"多线程"都是用单线程模拟出来的,一切javascript多线程都是纸老虎! 2.javascript事件循环 既然js是单线程,那就像只有一个窗口的银行,客户需要排队一个一个办理业务,同理js任务...

qq_41985171的博客 247

吃透JS同步与异步:从底层原理到Promise实战

JavaScript 是前端、Node.js 后端的核心编程语言,而同步与异步是 JS 最核心、最基础、也是面试高频的重难点。很多开发者只会写定时器、接口请求代码,却不懂底层执行逻辑,经常遇到「代码顺序错乱、接口嵌套地狱、定时器延迟不准」等问题。本文将从底层架构、异步任务类型、JS执行机制、Promise核心原理、实战案例、避坑指南全方位讲解JS同步异步,零基础也能彻底看懂。同步代码优先执行,异步代码延后执行,Event Loop 是同步和异步的调度核心。

suger__salt的博客 498

JS 异步遍历两种实战:串行保证顺序 + 并行提高效率

前端循环异步操作时,根据不同场景串行、并行执行

qq_43670721的博客 253

JavaScript 事件循环及异步原理(完全指北)

引言 最近面试被问到,JS 既然是单线程的,为什么可以执行异步操作? 当时脑子蒙了,思维一直被困在 单线程 这个问题上,一直在思考单线程为什么可以额外运行任务,其实在我很早以前写的博客里面有写相关的内容,只不过时间太长给忘了,所以要经常温习啊:(浅谈 Generator 和 Promise 的原理及实现) JS 是单线程的,只有一个主线程 函数内的代码从上到下顺序执行,遇到被调用的函数先进...

weixin_34260991的博客 211

js 遇到async await 的执行顺序示例

暂停前就已经被读取了,当时。:异步函数开始执行,但遇到。还是初始值 0,所以。是 0,而不是后续被。

lifengshu1234的专栏 165

JavaScript基础——异步任务的执行顺序

JavaScript的异步任务执行顺序,异步分为微任务和宏任务!

蜡笔不新的博客 775
上一篇: axios原理深入源码解析
下一篇: Vue双向绑定原理 从vue2的Object.defineProperty到vue3的proxy
前端小黑
博客等级 码龄9年 148粉丝 222原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值