我正在学习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
>请求(“ http://facebook.com”,…)
> main.js
>同样,该请求将被执行,并在解决回调时对其进行跟踪.它已从调用堆栈中删除.
> main.js
> console.log(‘我来求助’);
> main.js
>这可以立即执行,并将请求发送到您的控制台以记录这句话.现在,您的调用堆栈如下所示:
> main.js
> main.js完成,可以将其从调用堆栈中删除.您的呼叫堆栈现在为空.
> 100毫秒后解决了Facebook请求.回调函数函数(错误,响应,正文){…}已添加到事件队列.只有清除了调用堆栈后,才能执行事件队列中的操作.
>您的通话堆栈很清晰! facebook回调函数将添加到调用堆栈中并执行.控制台日志已发送.回调函数将从调用堆栈中删除.
> 200毫秒后,sohamkamani.com解析,并将其回调函数发送到事件队列.您的通话堆栈很清晰!回调函数将添加到调用堆栈,执行并从调用堆栈中删除.