一般来说,开始都认为是在等得一个async函数完成。但是按照语法说明的话,await是在等一个表达式,这个表达式的计算结果是Promise对象或者其它值(也就是说,没有什么特殊限定)。
因为async函数返回一个Promise对象,所以可以用于对待一个async函数的返回值——这也可以说是await在等async函数,但是要清楚的是,它等的实际是一个返回值。注意到await不仅仅用于等Promise对象,它可以等任意表达式的结果,所以await后面实际是可以接普通函数调用或者直接量的。所以下面这个示例完全可以正确运行:
function getSomething() {
return "something";
}
async function testAsync() {
return Promise.resolve("hello async");
}
async function test() {
const v1 = await getSomething();
const v2 = await testAsync();
console.log(v1, v2);
}
test();
await表达式的运算结果取决于它等的是什么:
- 如果它等到的不是一个Promise对象,那么await表达式的运算结果就是它等到的东西。
- 如果它等到的是一个Promise对象,await就忙起来了,它会阻塞后面的代码,等着Promise对象resolve,然后得到resolve的值,作为await表达式的运算结果。
举个例子:
function testAsy(x){
return new Promise(resolve=>{setTimeout(() => {
resolve(x);
}, 3000)
}
)
}
async function testAwt(){
let result = await testAsy('hello world');
console.log(result); // 3秒钟之后出现hello world
console.log('cuger') // 3秒钟之后出现cuger
}
testAwt();
console.log('cug') //立即输出cug
// cug
// hello world
// cuger
这就是await必须用在async函数中的原因。async函数调用不会造成阻塞,它内部所有的阻塞都被封装在一个Promise对象中异步执行。await暂停当前async的执行,所以‘cug’会最先输出,hello world和cuger是3秒后同时出现的。