是否可以在没有await关键字的情况下调用异步函数?如果我们不等待就打电话怎么办?

时间:2019-03-06 09:22:42

标签: javascript reactjs react-native google-cloud-firestore

我想做以下事情,并记住它实际上对我有用。我的问题是怎么回事,是否可以从非异步async usrs()函数调用componentDidMount()函数? 如果不可能,为什么通过调用this.usrs(usrs)而不是await this.usrs(usrs);

为我工作
let outState = {};
class A extends Component{
  componentDidMount(){
   this.usrs(usrs);
  }
  getData(usr){
    return db.collection('a/'+usr+'/bb').get().then(snap=>{
      for(i = snap.docs.length-1; i>=0; i--){
         outState[usr] = [...outState[usr], snap.docs[i].data()];
         if(i === 0) return outState;
      }
     return false;
    });
  }

  async usrs(usrs){

   let os = {}, data = {};

    for(i = usrs.length-1; i>=0; i--){

       os = await this.getData(usrs[i]);
       if(os){
          data = { ...data, ...os };
          if (i === 0) {
             this.setState({ ...this.state, ...data });
          }
       }

    }

  }

}

5 个答案:

答案 0 :(得分:5)

仅在调用方需要等待函数完成时才需要await,例如,在调用方需要函数结果时,或者在需要等待该函数的某些状态/数据更改时,原因。如果没有这种依赖性,则可以不使用await关键字而“解雇”。

正如其他人所提到的,您也可以使用.then,但是基本规则是相同的:在函数完成后有特定的事情要做时,您可以这样做。否则可以省略。

因此具体来说:对于“调用者”,我只是指调用异步函数的函数。您的情况应该是componentDidMount。然后,这些选项就非常简单:

  1. 保持原样。 usrs()将完全在后台运行,而componentDidMount将继续运行直到结束。
  2. 使用await,因此componentDidMount将等待usrs()的返回。
  3. 使用usrs().then(),因此componentDidMount可以继续,但是如果需要在.then()返回之后执行某些操作,则usrs()中指定的代码将被调用usrs()完成。

答案 1 :(得分:3)

函数名称之前的异步工作意味着该函数始终返回promise,因此可以。

await使JavaScript等待直到承诺被解决,并且在您需要处理该承诺的结果时暂停。

为了更好地理解它,我建议您参阅下一页https://javascript.info/async-await

答案 2 :(得分:3)

您可以从任何地方调用异步函数。 异步函数returns a promise,因此,如果您像下面这样调用它,就可以像使用Promise一样使用它。

async function example(){
  return 10;
}
const returnOfAsync = example()
console.log(returnOfAsync instanceof Promise) // true
returnOfAsync.then((theReturn) => {
  console.log(theReturn) // 10
})

答案 3 :(得分:1)

在需要调用并等待await函数或async的时候使用Promise
在您的情况下,当您在await内不带componentDidMount的情况下调用该函数时,您的函数可以使用,但您的componentDidMount不会等待该函数完全完成。
另外,如果您不想使用await并且不想在componentDidMount内部等待,但是想在async函数完成时收到通知,则可以使用{{ 1}}。因为.then函数返回async

这是您的PromisecomponentDidMount。请注意,在此示例中,.then将在this.doSomethingElse完成之前调用,并且只会在this.usrs内部通知您.then结果:

this.usrs

答案 4 :(得分:1)

在幕后,等待只是使用了一个Promise(与then()相同),不同之处在于它在继续执行其后的代码之前要等待Promise解析。

所以...

使用await调用异步函数,异步函数完成后,您将收到结果。异步调用返回后,将执行等待之后的所有代码。

不等待就调用异步函数,您将获得一个Promise作为返回值。等待之后的代码将立即执行。

如果异步调用后的代码需要异步调用返回的值,或者取决于异步调用中发生的事情,请使用await。如果没有,那就不要。