我一直在寻找解决方案,但没有为我的应用程序工作,我正试图使用angular和firestore与angular fire构建一个Quiz应用程序,我目前的方法是:
public getRandomQuestion(): Promise<any> {
let ques: IQuestion;
return this.firestore.collection('questions', ref => ref.where('randId', '>=', this.getRandomInt(1,999999)).limit(1)).valueChanges().toPromise();
}
public getTenRandomQuestion(): IQuestion[]{
let obs : IQuestion[] = [];
for (let i: number = 0; i <= 9; i++){
this.getRandomQuestion().then(res => {
obs[i] = res;
});
}
console.log(obs);
return obs;
}
但它总是返回一个空数组,这是我的火库:Firestore
如果添加一些日志记录或在调试器中运行代码,则可以很容易地看到return obs
在调用obs[i] = res
之前运行。
这就解释了为什么总是得到一个空数组,getTenRandomQuestion
方法在从数据库加载任何数据之前就结束了。
解决方案是返回一个Promise
,就像从getRandomQuestion
返回一样。
public getTenRandomQuestion(): Promise<IQuestion>[]{
let obs : Promise<IQuestion>[] = [];
for (let i: number = 0; i <= 9; i++){
obs[i] = this.getRandomQuestion();
}
return obs;
}
然后,当您调用getTenRandomQuestion
时,您可以添加then()
子句,或者使用async
和await
。