是否可以在没有 await 关键字的情况下调用异步函数? 如果我们在没有等待的情况下调用会发生什么?



我想执行以下操作,请记住它实际上对我有用。 我的问题是会发生什么,是否可以从非异步componentDidMount()func 调用async usrs()func? 如果不可能为什么它通过打电话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 });
}
}
}
}
}

如果调用方需要等待函数完成,例如,当它需要函数的结果时,或者当它需要等待函数导致的某些状态/数据更改时,你只需要await。如果没有这样的依赖关系,你可以"即发即弃",不使用await关键字。

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

所以具体地说:对于"caller",我只是指调用异步函数的函数。在您的情况下,那将componentDidMount.选项非常简单:

  1. 保持原样。usrs()将完全在后台运行,componentDidMount将继续运行直到结束。
  2. 使用await,所以componentDidMount会等待usrs()的返回。
  3. 使用usrs().then(),以便componentDidMount可以继续,但如果您需要执行在usrs()完成后必须执行的操作,则会在usrs()返回后调用.then()中指定的代码。

当我们需要调用并等待async函数或Promise时,我们使用await
在您的情况下调用它而没有await在您的componentDidMount中,您的函数将工作,但您的componentDidMount不会等待该函数完全完成。
此外,如果您不想使用await并且不想在componentDidMount内部等待,但您希望在async函数完成时收到通知,则可以改用.then。因为async函数返回Promise

以下是您对.then
componentDidMount请注意,在此示例中,this.doSomethingElse将在this.usrs完成之前调用,并且只有在.then完成后才会通知您有关this.usrs结果的信息:

componentDidMount(){
this.usrs(usrs).then(() => {
// Your functions completely finished
})
.catch(err => {
// There was an error
});
this.doSomethingElse();
}

函数名称之前的异步工作意味着函数始终返回一个承诺,所以是的,这是可能的。

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

为了更好地理解它,我建议查看以下页面 https://javascript.info/async-await

您可以从任何地方调用异步函数。 异步函数返回一个承诺,所以如果你像下面这样调用它,你可以像对待一个承诺一样使用它。

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

在引擎盖下,await 只是使用一个承诺(与 then() 相同),区别在于它等待承诺解析,然后再继续执行它后面的代码。

所以。。。

使用 await 调用异步函数,您将在异步函数完成后收到该函数的结果。 await 之后的任何代码都将在异步调用返回后执行。

在没有 await 的情况下调用异步函数,您将获得一个 promise 作为返回值。await 后面的代码将立即执行。

如果异步调用后面的代码需要从异步调用返回的值,或者依赖于异步调用中发生的某些内容,请使用 await。 如果没有,那就不要。

相关内容

  • 没有找到相关文章

最新更新