写在前面
笔记内容大多出自于拉勾教育大前端高薪训练营的教程,因此也许会和其他文章雷同较多,请担待。
EventLoop
- js代码被读取后会进行一次匿名函数的执行,执行的就是js的本身
- 首先一行一行执行完代码中的同步操作,如果遇到了异步操作则将异步操作移到事件队列中
- 其次执行微任务,例如Promise
- 最后执行宏任务,例如定时器,定时器时间短的会先进入执行栈
- 因为微任务宏任务内也有同步操作和微任务宏任务等异步操作,所以任务事件内会再走一次以上步骤,如果宏任务内还有宏任务,需要等该宏任务被执行后,内部的宏任务才会被挂载到事件队列上
Promise
- 如果then里不是一个函数,则直接无视,比如Promise.resolve(1).then(2).then(Promise.resolve(3)).then(console.log) -> 输出为1,因为中间两个then都是不返回的函数
Generator
- next(params)传入的params会当做暂停的那个yield的返回值回到生成器中
- next()返回对象中的value是yield暂停时抛出的值,done是传递参数
function * foo() {
try {
console.log('generator start')
const res = yield 'first'
console.log(res)
} catch (e) {
console.log(e)
}
}
const generator = foo()
const result = generator.next()
console.log(result) // { value: 'first', done: false } 会从yield停止,并且返回yield后的值
generator.next('bar') // bar 会从yield开始,并且将传入的值作为yield的返回值继续往下走
generator.throw(new Error('generator error')) // Error: generator error 进入catch被捕获
/* ------- 模拟请求 ------- */
function * request()