function fu() {
setTimeout(() => {
console.log(1)
}, 2000)
setTimeout(() => {
console.log(2)
}, 2000)
setTimeout(() => {
console.log(3)
}, 2000)
setTimeout(() => {
console.log(4)
}, 2000)
}
fu();
如图,js不是单线程的吗?为什么这几个命令会在两秒后同时输出?单线程不应该是每两秒输出一个吗?
首先,当代码执行到第一个延时器时,延时器两秒后输出,
这期间其他的代码执行顺序并不是等这这个延时器执行完再继续往下走,
而是将这个延时器放在异步队列里面,随之执行后面代码第二个延时器,继续将第二个延时器放入异步队列;
继续往下执行代码,第三个延时器,以此类推,因为代码执行速度很快,放在异步队列中的延时器都是两秒,所以几乎是同时输出
如果要一直等延时器结束,再执行下一步的话,博主可以研究一下async/await的用法
首先要了解js的异步队列模式,js是单线程的;主线程自上而下执行代码,遇到异步代码例如setTimeout延迟器、Promise对象、ajax等,就会将代码交给异步队列,待主线程的代码执行完毕后就会执行异步队列的代码了。
所以这里的四个延迟器都会进入异步队列,然后设置的延迟器时间结束后就会执行对应的内部代码;你可以将四个延迟器的延时时间设置成3000,1000,2000,4000;输出的就是2,3,1,4了
没有同时进行啊,你延时设置成一样的啊,老哥,代码从上到下放入异步队列能查0........几几秒啊,肯定是按照你的代码顺序一个个弹出异步操作啊