我想执行以下操作,请记住它实际上对我有用。 我的问题是会发生什么,是否可以从非异步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
.选项非常简单:
- 保持原样。
usrs()
将完全在后台运行,componentDidMount
将继续运行直到结束。 - 使用
await
,所以componentDidMount
会等待usrs()
的返回。 - 使用
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。 如果没有,那就不要。