异步面试知识点

2020-11-25  本文已影响0人  guoXuJianShu

应用场景

Promise解决callback hell

function loadImg(src) {
    const p = new Promise(
        (resolve, reject) => {
            const img = document.createElement('img')
            img.onload = () => {
                resolve(img)
            }
            img.onerror = () => {
                const err = new Error(`图片加载失败 ${src}`)
                reject(err)
            }
            img.src = src
        }
    )
    return p
}

// loadImg(url).then(img => {
//     console.log(img.width)
//     return img
// }).then(img => {
//     console.log(img.height)
// }).catch(ex => console.error(ex))

const url1 = 'https://img.mukewang.com/5a9fc8070001a82402060220-140-140.jpg'
const url2 = 'https://img3.mukewang.com/5a9fc8070001a82402060220-100-100.jpg'

loadImg(url1).then(img1 => {
    console.log(img1.width)
    return img1 // 普通对象
}).then(img1 => {
    console.log(img1.height)
    return loadImg(url2) // promise 实例
}).then(img2 => {
    console.log(img2.width)
    return img2
}).then(img2 => {
    console.log(img2.height)
}).catch(ex => console.error(ex))

1. Promise三种状态

2. Promise状态的表现

3. then和catch改变状态

场景题 - promise then和catch的连接



event loop(时间循环、事件轮询)

  1. 同步代码,一行一行放在 Call Stack执行

  2. 遇到异步,会先“记录”,等待时机(定时、网络请求等)

  3. 时机到了,就移动到Callback Queue

  4. 如 Call Stack 为空(即同步代码执行完)Event Loop开始工作

  5. 轮询查找Callback Queue,如有则移动到Call Stack执行

  6. 然后继续轮询查找(永动机一样)



async/await和Promise的关系

async/await是语法糖,本质还是回调函数

for - of的 应用场景: 实现异步遍历

宏任务 macroTask 和微任务 microTask

1. event-loop和DOM渲染的关系

Call Stack空闲时,就会尝试DOM渲染,然后触发event loop,再执行Callback Queue里的代码,再尝试DOM渲染,如此循环

2. 微任务和宏任务的区别

3. 微任务和宏任务的根本区别

上一篇 下一篇

猜你喜欢

热点阅读