都知道异步请求不会马上执行得到结果,是浏览器新开了一个线程去跑(异步http请求线程),跑完把注册的success回调放到事件队列里面?我不确定是不是这样
建议了解下 JavaScript的运行机制:
以上概括:调用站中的同步任务都执行完毕,站内被清空了,就代表主线程空闲了,这个时候就会去任务队列中按照顺序读取一个任务放入到栈中执行。每次栈内被清空,都会读取任务队列有没有任务,有就读取执行,一直循环 读取-执行 的操作。
一个事件循环中有一个或者是多个任务队列
JavaScript中两种异步任务:
主线程从“任务队列”中读取执行时间,这个过程是循环不断的,这个机制被称为事件循环。
机制具体如下:主线程会不断从任务队列中按顺序读取任务执行,每执行完一个任务都会检查microtask队列是否为空(执行完一个任务的具体标志是函数执行栈为空),如果不为空则会一次性执行完所有microtask,然后再进入下一个循环去任务队列中读取下一个任务执行。
详细说明:
执行进入 microtask检查点的具体步骤如下:
需要注意的是:当前执行栈执行完毕时会立刻先处理所有微任务队列中的事件,然后再去宏任务队列中取出一个事件。同一次事件循环中,微任务永远在宏任务之前执行。
[image:19EE9765-9704-46EC-844A-10ACF8EF4D91-348-000037EE76914D21/D6E7E818-B877-4861-BE11-81BC649E3262.png]
setTimeout(()=>{
console.log(“setTimeout1”);
Promise.resolve().then(data => {
console.log(222);
});
});
setTimeout(()=>{
console.log(“setTimeout2”);
});
Promise.resolve().then(data=>{
console.log(111);
});
运行结果为:
111
setTimeout1
222
setTimeout2
JS 引擎是如何执行这段代码的:
因为JavaScript是单线程的。单线程就意味着,所有任务需要排队,前一个任务结束,才会执行后一个任务。如果前一个任务耗时很长,后一个任务就不得不一直等着。为了协调事件(event),用户交互(user interaction),脚本(script),渲染(rendering),网络(networking)等,用户代理(user agent)必须使用事件循环。
10 回答11.1k 阅读
6 回答3k 阅读
5 回答4.8k 阅读✓ 已解决
4 回答3k 阅读✓ 已解决
2 回答2.6k 阅读✓ 已解决
3 回答1.8k 阅读✓ 已解决
3 回答1.4k 阅读✓ 已解决
是。
只不过这个线程可能不是新开的,而是一直放在那里专门干这个的。