ES6中Promise、async和await面试题整理

 更新时间:2023年02月22日 09:46:01   作者:斯图尔te  
promise是每个前端人必须会接触到的一个知识点,下面这篇文章主要给大家介绍了关于ES6中Promise、async和await面试题的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下

学习过程中遇到的一些基础的Promise、async、await面试题整理。

出题目的:

  • 考察 Promise、async、await 的基础
  • 考察队Event Loop、宏任务、微任务的理解

知识点:

  • JS 执行顺序:单线程,自上而下、先同步后异步、先微任务后宏任务
  • new promise() -> Promise.resolve(),触发then
  • new promise((reject)=>{reject()}) -> promise.reject(),触发catch
  • then 和 catch 内部没有 throw new Error 相当于 resolve
  • async function 相当于返回 Promise.resolve()
  • await 后面的代码都是异步的,微任务;setTimeout是宏任务
  • 初始化Promise时,函数内部代码会被立即执行

代码:

考点1:Promise.resolve、Promise.reject执行顺序

Promise.resolve().then(() => {  // 优先寻找then
		console.log(1);
	}).catch(() => {
		console.log(2);
	})
	// 1
Promise.reject().then(() => {  // 优先寻找catch
		console.log(1);
	}).catch(() => {
		console.log(2);
	})
	// 2

考点2:then 和 catch 内部没有 throw new Error() 相当于 resolve

Promise.resolve().then(() => {
		console.log(1);
	}).catch(() => {
		console.log(2);
	}).then(() => {
		console.log(3);
	})
	// 1 3
Promise.reject().then(() => {
		console.log(1);
	}).catch(() => {
		console.log(2);
	}).then(() => {
		console.log(3);
	})
	// 2 3
Promise.reject().then(() => {
		console.log(1);
	}).catch(() => {
		console.log(2);
		throw new Error();
	}).then(() => {
		console.log(3);
	})
	// 2 报错
Promise.reject().then(() => {
		console.log(1);
	}).catch(() => {
		console.log(2);
		throw new Error();
	}).then(() => {
		console.log(3);
	}).catch(() => {
		console.log(4);
	})
	// 2 4

考点3:async function -> 相当于返回一个 Promise.resolve

const res = async function fn() {
	return 100;
}
console.log(res());  // 返回一个resolve状态的Promise对象 Promise {<fulfilled>: 100}
res().then(()=>{
	console.log(0);
}).catch(()=>{
	console.log(1);
})
// 0

(async function () {
	const a = fn();
	const b = await fn();
	console.log(a);  // Promise {<fulfilled>: 100}
	console.log(b);  // 100
})()

考点4: await 代码执行顺序

async function fn1() {
	console.log("fn1 start");
	await fn2();
	console.log("fn1 end");
}
async function fn2() {
	console.log("fn2 start");
}
console.log("start");
fn1();
console.log("end");
/**
 * 打印顺序:
 * start
 * fn1 start
 * fn2 start
 * end
 * fn1 end
 */
async function fn1() {
	console.log("fn1 start");
	await fn2();
	console.log("fn1 end");
	await fn3();
	console.log("fn3 end");
}
async function fn2() {
	console.log("fn2");
}
async function fn3() {
	console.log("fn3");
}
console.log("start");
fn1();
console.log("end");
/**
 * 打印顺序:
 * start
 * fn1 start
 * fn2
 * end
 * fn1 end
 * fn3
 * fn3 end
 */

考点5:Promise 与 setTimeout 执行顺序

console.log("start");
setTimeout(()=>{
	console.log("setTimeout")
});
Promise.resolve().then(()=>{
	console.log("Promise")
})
console.log("end")
/**
 * 打印顺序:
 * start
 * end
 * Promise
 * setTimeout
 */
async function fn1() {
	console.log("fn1 start");
	await fn2();
	console.log("fn1 end");  // await后面的代码为"微任务代码"
}
async function fn2() {
	console.log("fn2");
}
console.log("start");
setTimeout(()=>{
	console.log("setTimeout");  // 宏任务 
});
fn1();
console.log("end");
/**
 * 打印顺序:
 * start
 * fn1 start
 * fn2
 * end
 * fn1 end
 * setTimeout
 */

附:promise与async await结合使用

昨天看了一道字节外包的面试题

 const list = [1, 2, 3];
    const square = num => {
        return new Promise((resolve, reject) => {
            setTimeout(() => {
                resolve(num * num);
            }, 1000);
        });
    }
    function test() {
        // 修改这里的代码
        list.forEach(async x => {
            const res = await square(x);
            console.log(res);
        });
    }
    test()

需要修改的是把同步执行的数组替换成换成异步打印。

在测试以后我们可以-验证,forEach和for循环不同的是for循环可以修改数组的值,且forEach取不到具体某一项的值,这里的异步说的是每执行一次数组循环,就执行一步test()方法,

const list = [1, 2, 3];
const square = num => {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve(num * num);
        }, 1000);
    });
}
 function test() {
  for(let x of list) {
    var res = await square(x)
    console.log(res)
  }
}
test()

总结

到此这篇关于ES6中Promise、async和await面试题整理的文章就介绍到这了,更多相关ES6 Promise、async、await面试题内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • JavaScript Date对象功能与用法学习记录

    JavaScript Date对象功能与用法学习记录

    这篇文章主要介绍了JavaScript Date对象功能与用法,结合实例形式总结分析了JavaScript Date对象基本功能、用法及操作注意事项,需要的朋友可以参考下
    2020-04-04
  • 基于HTML+CSS+JS实现纸牌记忆游戏

    基于HTML+CSS+JS实现纸牌记忆游戏

    这篇文章主要介绍了如何利用HTML、CSS 和 JavaScript 制作纸牌记忆游戏,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起动手尝试一下
    2022-04-04
  • 鼠标滑过出现预览的大图提示效果

    鼠标滑过出现预览的大图提示效果

    这篇文章主要介绍了如何实现鼠标滑过出现预览的大图提示效果,需要的朋友可以参考下
    2014-02-02
  • Echarts柱状图修改柱子颜色渐变及柱子圆角效果实例

    Echarts柱状图修改柱子颜色渐变及柱子圆角效果实例

    在ECharts中,可以通过修改series.itemStyle.normal属性来定制柱状图的柱子样式,包括圆角和背景色渐变,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-09-09
  • 浅谈JS中的三种字符串连接方式及其性能比较

    浅谈JS中的三种字符串连接方式及其性能比较

    下面小编就为大家带来一篇浅谈JS中的三种字符串连接方式及其性能比较。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-09-09
  • 图片无缝滚动代码(向左/向下/向上)

    图片无缝滚动代码(向左/向下/向上)

    想必大家都注意到marquee的不循环滚动,所以出现了很多替代脚本,接下来为大家详细介绍下:向左滚动/图片左无缝滚动/向下滚动/图片下无缝滚动/向上滚动的实现
    2013-04-04
  • JavaScript中的console.dir()函数介绍

    JavaScript中的console.dir()函数介绍

    这篇文章主要介绍了JavaScript中的console.dir()函数介绍,console.dir主要用来dump某些对象的详细信息,需要的朋友可以参考下
    2014-12-12
  • JS当前属性查询实现代码

    JS当前属性查询实现代码

    JS中的for in 可遍历变量的所有属性!利用此特性制作了一个JS当前属性查询!
    2010-12-12
  • 判断ie的两种简单方法

    判断ie的两种简单方法

    判断ie想必大家都会写吧,如何将判断条件变得简单呢,也许大家并不是很清楚,感兴趣的大家可以参考下本文,或许会有所收获
    2013-08-08
  • Javascript刷新页面的实例

    Javascript刷新页面的实例

    这篇文章主要介绍了Javascript刷新页面的实例的相关资料,希望通过本文能帮助到大家,需要的朋友可以参考下
    2017-09-09

最新评论