我是否必须一直等待调用链?

时间:2017-07-27 11:30:31

标签: javascript

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



await




4 个答案:

答案 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得到解决,但异步函数中的等待不是强制性的,仅适用于这种情况。试想“我有一个承诺?我需要在异步之前解决这个问题吗?”如果答案是双重的,那么请使用等待。