console.log('start') function part1 () { console.log('loading part1') } function part2 () { console.log('loading part2') part1() } part2() console.log('end') // 顺序结果 start --- loading part2 --- loading part1 --- end // 同时就会触发概念里面那个问题,如果有一个任务耗时特别长,就会出现页面卡死情况,为了避免这种情况,也就有了另一种模式,异步
console.log('start') setTimeout (function timer1 () { console.log('timer1 invoke') }, 2000) setTimeout (function timer2 () { console.log('timer2 invoke') setTimeout (function inner () { console.log('inner') }, 1000) }, 1000) console.log('end') // 结果 start --- end --- timer2 invoke --- timer1 invoke --- inner // 同步任务开始执行,碰到计时器丢到任务队列中,同步任务执行完毕,没有微任务,开始执行宏任务,根据倒计时时间,以及里面是否还有其他对应操作,直到结束。 // js 执行引擎先去做完调用栈里面所有的任务,通过事件循环从消息队列中再取出一个任务出来继续执行,以此类推,同时还能随时往消息队列中放入新的任务,排队等待执行,以上就是基本的概念。
function foo (callback) { setTimeout(function () { callback() }, 3000) } foo(function () { console.log('这就是一个回调函数') console.log('调用者定义这个函数,执行者执行这个函数') console.log('其实就是调用者告诉执行者异步任务结束后应该做什么') }) // 随之而来,就出现了另一个问题,如果说函数A为回调函数,但是他又接受函数B作为参数,函数B又有一个函数C,这就形成了层层嵌套,就会出现回调地狱。为了解决这个问题,出现了 Promise
// 基本栗子 const promise = new Promise(function (resolve, reject) { resolve(200) // 成功 // reject(new Error('rejected')) // 失败 }) // 通过.then 调用 promise.then(function (value) { console.log('resolved', value) }, function(error) { console.log('rejected, error') }) 注释失败代码那一行,结果就是 200成功 注释成功代码那一行,结果就是 失败
评论已关闭。