当调用getUrlAsync时,JS运行时做以下事情:
1. 会创建一个Promise对象,此时还是在getUrlAsync的栈帧里;
2. 然后创建一个XMLHttpRequest对象,此时还是在getUrlAsync的栈帧里;
3. 调用XMLHttpRequest的open方法,此时浏览器其他线程接管open过程,JS无需等待open结束;
4. 给xhr的onload事件关联一个处理函数(委托),注意此时该事件并没有进入事件队列;
5. 给xhr的onerror事件关联一个处理函数(委托),同样此时该事件没有进入运行时的事件队列;
6. 传入res => console.log(res)来具体化第4步中的委托;
7. 传入error => console.log(error)来具体化第5部中的委托,此时当前的运行栈就退出了,运行时将处理其他事件。
在某一个时刻,浏览器控制的open方法返回,它会在JS运行时的事件队列中添加一个事件,比如onload
8. JS运行时循环到onload事件,并找到它的关联处理函数,在这个例子中就是res => console.log(res),并运行这个函数。
Linux公社的RSS地址:https://www.linuxidc.com/rssFeed.aspx