我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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");

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");

考点5:Promise 与 setTimeout 执行顺序

console.log("start");
setTimeout(()=>{
	console.log("setTimeout")
});
Promise.resolve().then(()=>{
	console.log("Promise")
})
console.log("end")

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");

附: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面试题内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

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

promise是每个前端人必须会接触到的一个知识点,下面这篇文章主要给大家介绍了关于ES6中Promise、async和await面试题的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
2023-02-22

ES6中Promise、async和await面试题实例代码分析

这篇“ES6中Promise、async和await面试题实例代码分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“ES6中
2023-07-05

ES6中的Promise对象与async和await方法详解

Promise是es6引入的异步编程薪解决方案,语法上promise就是一个构造函数,用来封装异步操作病可以获取其成功或失败的结果,这篇文章主要介绍了ES6中的Promise对象与async和await方法,需要的朋友可以参考下
2022-12-29

2020面试必知:中高级工程师面试题集整理(题目+答案)

这些面试题是我准备换工作的时候整理,没有重点。包括java基础,数据结构,网络,Android相关等等。
2023-06-04

编程热搜

目录