js事件轮询:
- js 是一门单线程语言,从上往下执行的,首先,主线程读取js代码,此时是同步的环境
- 当主线程检测到异步操作,就会交给其他异步线程处理,然后继续执行主线程的的任务
- 异步任务执行完毕之后,判断异步任务的类型,异步任务可分成宏任务和微任务,像setTimeout、setInterval属于宏任务,promise.then属于微任务,不同的任务进入不同的队列,等待主线程空闲时候调用。
- 当主线程的的同步任务执行完毕之后,开始执行微任务队列里面的所有微任务,执行完微任务,就执行宏任务队列里面所有的宏任务
- 执行完成之后,主线程开始询问任务队列里面是否还有等待的任务,如果有则进入主线程继续执行
以上步骤重复执行就是事件轮询
- 微观任务是先于宏观任务的
- await: 先将await的结果打印出来,await后面的任务类似于promise放入微任务
- 执行到new Promise(),Promise构造函数是直接调用的同步代码,resolve如果调用的方法也会立即执行,如果调用的是同步方法就会同步执行,如果是异步方法就会按照异步方法执行
- 代码接着运行到promise.then( ),发现这是一个微任务,推入当前宏任务的微任务队列中。
setTimeout(function () {
console.log('setTimeout');
})
new Promise(function (resolve) {
console.log('promise');
}).then(function () {
console.log('then');
})
console.log('console');
function aaa() {
console.log(123)
}
setTimeout(function () {
console.log('setTimeout');
});
(() => new Promise(function (resolve) {
console.log('promise');
resolve(aaa())
}).then(function () {
console.log('then');
}))();
console.log('console');
async function async1() {
console.log("async1 start")
await async2()
console.log("async1 end")
}
async function async2() {
console.log("async2")
}
console.log("script script")
setTimeout(function () {
console.log("setTimeout")
}, 0)
new Promise(function (resolve) {
console.log("promise1")
resolve()
}).then(function () {
console.log('promise2')
})
async1()
console.log("script end")
console.log('example-start')
setTimeout(() => {
console.log('setTimeout-0')
}, 0)
new Promise((resolve, reject) => {
console.log('promise-1')
resolve('promise-2')
Promise.resolve().then(() => console.log('promise-3'))
}).then((response) => {
console.log(response)
setTimeout(() => {
console.log('setTimeout-10')
}, 10)
})
console.log('example-end')
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。