前端面试题 - 手写一个Promise

    科技2025-08-26  12

    前端面试题 - 手写一个Promise

    问题一:同步与异步的区别?问题二:为什么使用Promise?问题三:手写一个Promise?问题四:前端异步都有哪些场景?

    问题一:同步与异步的区别?

    JavaScript是单线程语言,同步会阻塞代码执行,异步不会阻塞代码执行。 补充:JavaScript是单线程语言,意味着只能同时做一件事。也就是说,发送请求遇到阻碍时,浏览器会卡住,卡住期间不能滚动、不能点击、不能有动画。异步是基于callback回调函数形式来调用的,每个异步都有回调函数。代码执行的顺序,先执行同步任务,再执行异步任务。

    问题二:为什么使用Promise?

    Promise解决了callback hell回调地狱的问题。 回调地狱即多层嵌套写法,难以辨识,不利于调试。Promise的优势:串联形式而非嵌套形式,仅一层。写法美观,可读性强,便于理解,便于调试。

    问题三:手写一个Promise?

    举例通过Promise函数加载图片。

    let imgUrl1='https://aaa.com/000.jpg' let imgUrl2='https://aaa.com/111.png' // 定义图片加载的函数 function imgUpload(src) { // 创建Promise实例,切记要return出去。 const p = new Promise( // 回调函数,参数是两个函数,resolve与reject (resolve,reject)=>{ // 创建DOM元素 const img = document.createElement('img'); // src赋值 img.src=src // 图片加载成功时回调resolve函数,传入img元素 img.onload = ()=>{ resolve(img) } // 图片加载失败时回调reject函数,传入img元素 img.onerror = () => { const err = new Error(`图片加载失败${src}`) reject(err) } } ) return p } // .then是成功状态下的回调 // .catch是失败状态下的回调 imgUpload(imgUrl1).then(img=>{ console.log(img.width); return img }).then(img=>{ console.log(img.height); return imgUpload(imgUrl2) }).then(img=>{ console.log(img.width); return img }).then(img=>{ console.log(img.height); }).catch(err=>{ console.log(err,'err'); })

    问题四:前端异步都有哪些场景?

    网络请求,如Ajax。定时任务,如setTimeout。
    Processed: 0.013, SQL: 8