Javascript-如果一个线程中有多个线程,异步函数的执行顺序如何?

前端之家收集整理的这篇文章主要介绍了Javascript-如果一个线程中有多个线程,异步函数的执行顺序如何? 前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我正在学习javascript中异步函数的概念.我知道javascript是单线程的,回调函数放在线程中的同步可执行代码后面.这篇文章解释得很好.
https://www.sohamkamani.com/blog/2016/03/14/wrapping-your-head-around-async-programming/

但是本文没有解释我的一个问题,如果代码中有多个回调函数,该怎么办?例如,下面的代码,执行的顺序是什么?是首先执行异步功能1还是异步功能2?预先感谢!

var request = require('request');

// async function 1: take 200ms
request('http://sohamkamani.com',function (error,response,body) {
  console.log(body);
})

// async function 2: take 100ms
request('http://facebook.com',body) {
  console.log(body);
})

console.log('I come after the request');

最佳答案
根据您对事件的描述,这里大概是事情的发生.这里的重要概念涉及异步处理,调用堆栈和事件队列.

>您的脚本(我们称其为main.js)将被添加调用堆栈中.现在,您的调用堆栈如下所示:

> main.js

> main.js开始执行.第一行添加调用堆栈中.现在,您的调用堆栈如下所示:

>请求(‘http://sohamkamani.com‘,…)
> main.js

>该请求将被执行,无论何时解决回调,都会对其进行跟踪.由于这里没有其他事情可做,因此将其从调用堆栈中删除.因此,您的调用堆栈现在看起来像这样:

> main.js

> main.js中的下一行将添加调用堆栈中.

>请求(“ http://facebook.com”,…)
> main.js

>同样,该请求将被执行,并在解决回调时对其进行跟踪.它已从调用堆栈中删除.

> main.js

>下一行添加调用堆栈

> console.log(‘我来求助’);
> main.js

>这可以立即执行,并将请求发送到您的控制台以记录这句话.现在,您的调用堆栈如下所示:

> main.js

> main.js完成,可以将其从调用堆栈中删除.您的呼叫堆栈现在为空.
> 100毫秒后解决了Facebook请求.回调函数函数(错误,响应,正文){…}已添加到事件队列.只有清除了调用堆栈后,才能执行事件队列中的操作.
>您的通话堆栈很清晰! facebook回调函数添加调用堆栈中并执行.控制台日志已发送.回调函数将从调用堆栈中删除.
> 200毫秒后,sohamkamani.com解析,并将其回调函数发送到事件队列.您的通话堆栈很清晰!回调函数添加调用堆栈,执行并从调用堆栈中删除.

猜你在找的JavaScript相关文章