我想做以下事情,并记住它实际上对我有用。我的问题是怎么回事,是否可以从非异步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 });
}
}
}
}
}
答案 0 :(得分:5)
仅在调用方需要等待函数完成时才需要await
,例如,在调用方需要函数结果时,或者在需要等待该函数的某些状态/数据更改时,原因。如果没有这种依赖性,则可以不使用await
关键字而“解雇”。
正如其他人所提到的,您也可以使用.then
,但是基本规则是相同的:在函数完成后有特定的事情要做时,您可以这样做。否则可以省略。
因此具体来说:对于“调用者”,我只是指调用异步函数的函数。您的情况应该是componentDidMount
。然后,这些选项就非常简单:
usrs()
将完全在后台运行,而componentDidMount
将继续运行直到结束。await
,因此componentDidMount
将等待usrs()
的返回。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
这是您的Promise
和componentDidMount
。请注意,在此示例中,.then
将在this.doSomethingElse
完成之前调用,并且只会在this.usrs
内部通知您.then
结果:
this.usrs
答案 4 :(得分:1)
在幕后,等待只是使用了一个Promise(与then()相同),不同之处在于它在继续执行其后的代码之前要等待Promise解析。
所以...
使用await调用异步函数,异步函数完成后,您将收到结果。异步调用返回后,将执行等待之后的所有代码。
不等待就调用异步函数,您将获得一个Promise作为返回值。等待之后的代码将立即执行。
如果异步调用后的代码需要异步调用返回的值,或者取决于异步调用中发生的事情,请使用await。如果没有,那就不要。