一直到现在的面试,越来越疯狂了,前几年还问,ES6啥啥啥的,现在都快ESX了,真是像某家手机厂商一样,编号一年增长好几个数字。
Promise最早考的是ES6的知识点,到后来,ES7的async/await了,到后来ES8了,很多面试官估计也快要吐了,都按ES6来问吧。但其实哪个知识点是ES几出的,最好还是记一下,因为没准真的有人会问。
async/await 是 generator + promise的组合体。
必须成对出现吗?
如果你想在一个方法内使用await,让上一步走完,这一步的代码再执行,那么你就需要在方法定义的时候加上async,否则会报错。而await的返回,也是一个Promise对象。
<script>
function getName1() {
return new Promise((resolve, rejuect) => {
setTimeout(() => {
resolve('name1');
}, 1000)
})
}
function getName2() {
return new Promise((resolve, rejuect) => {
resolve('name2');
})
}
async function getName() {
let name1 = await getName1();
console.log(name1); // 等待1秒
let name2 = await getName2();
console.log(name2); // name1返回name2即可返回
}
getName();
</script>
以上代码中,虽然name2一直被name1卡着,name1有返回值了,很快name2的返回值也出现了。
如果方法内用了await,方法外没有用async,则会报错:
Uncaught SyntaxError: await is only valid in async functions and the top level bodies of modules
但如果方法外只写async,里面不写await可以吗?
可以的,不会报错,直接运行,但这样也就失去了await,一步一卡的效果。
如果某个await的方法体内异常了会怎么样?
刚才我们说,async的方法内可能根本就没有await,那么这个方法内如果含有Promise,结果reject了,那么返回的就是一个reject的promise;
如果await方法体内出现异常,reject了,那么整个方法内就会异常,不往下走了,卡死了。