今天被问到一题,async和await谁先返回。这个我之前没想过,按照习惯,我认为谁先被定义,谁先返回。因为await在async里面,所以我回答是async先返回。
现在看来,这个题虽然答对了,但是却并没有掌握考点。
实际上,在https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Statements/async_function 中,有对async和await的相关描述:
一个async异步函数可以包含await指令,该指令会暂停异步函数的执行,并等待Promise执行,然后继续执行异步函数,并返回
结果。
咋一看,似乎是await先返回,因为最后才返回结果。
因此,立刻在code上面实验一下,最初用fetch效果不明显,后来手动写个Promise,延时2秒:
const promise = () => {
return new Promise(resolve => {
console.log("promise start..");
setTimeout(() => {
resolve({ name: "tom" });
}, 2000);
});
};
const test = async () => {
try {
// const response = await fetch("./test.json");
console.log(1);
const response = await promise();
console.log(2);
console.log("response", response);
} catch (error) {
console.log(error);
}
};
发现输出是:
1
promise start..
test
Promise {<pending>}
(这里停顿2秒)
2
response
Object {name: "tom"}
因此的确是async先返回,返回的是pending状态的Promise。而结果也的确是最后返回的,毕竟结果与Promise是不同的。
测试代码位于 : codesandbox.io/s/strange-m…