如果我有async
函数,我是否必须在调用链中重复使用await
关键字,即使被调用的方法标记为async
并使用{ {1}}关键字本身?
await

答案 0 :(得分:3)
如果您希望解决承诺,请执行此操作。
因为
const result = bar();
完全有效:它会返回一个承诺。
使用await
,指示引擎等待承诺解决(或失败)并获得结果。有许多有效的案例,你甚至想要在async
函数内处理promise本身(例如添加操作)。
答案 1 :(得分:2)
不,你不要:
async function foo() {
const result = await baz(); //this is just required
console.log(result);
}
async function baz(){//mustnt be async
return bar();//simply return, no await required
}
async function bar() {//mustnt be async
console.log('waiting...');
return new Promise(resolve => setTimeout(() => resolve('result'), 1000)) ;//this isnt
}
您只需要在最高级别等待承诺(如果您不打算在某处更改数据)。
上面的示例不需要是 async ,但这必须:
async function buy(product){
if(await isAvailableNow()){
return buy();//buy is a promise
}else{
return buySomewhereElse();//another promise
}
}
答案 2 :(得分:2)
如果我有
async
功能,是否必须在调用链中重复使用await
关键字
如果函数是异步的,并且您想在异步函数完成后运行指令(在调用之后),那么是。总是。你用过了
return await new Promise(...);
bar()
中的这是一件奇怪的事情。此处不需要await
,因为您已将函数定义为async function bar() { ... }
。它隐含地返回一个Promise.resolve(...)
对象。所以最后,不管你在return语句中做了什么,你总是得到那个对象。
所以在将bar()
称为
const result = bar();
// stmt
然后result
包含一个promise对象,它在bar()
函数中异步执行任务并在其后运行stmt
。因此即使stmt
函数尚未完成,也会执行bar()
。
要解决此问题,您必须在通话时使用await
...
const result = await bar();
// stmt
在这种情况下,只有在完成条形图时才会执行stmt
。
答案 3 :(得分:1)
如果你想在解决异步之前得到Promise的结果,你需要等待。 await的唯一功能是等待Promise得到解决,但异步函数中的等待不是强制性的,仅适用于这种情况。试想“我有一个承诺?我需要在异步之前解决这个问题吗?”如果答案是双重的,那么请使用等待。