async和await谁先返回?

312 阅读1分钟

今天被问到一题,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…