【发布时间】:2021-01-23 07:27:18
【问题描述】:
您好,我的行为很奇怪。
我正在迭代一些文档并设置一些承诺,即当获取文档时,UI 会更新。
然而,虽然 promise 是原子的,但 firestore / AngularFire 会等待所有的 promise。
例子:
for (const event of events) {
this.eventService.getEventActivitiesAndSomeStreams(this.user,
event.getID(),
[DataLatitudeDegrees.type, DataLongitudeDegrees.type])
.pipe(take(1)).toPromise().then((fullEvent) => {
this.logger.info(`Promise completed`)
})
}
人们会期望随着数据的到来,对于每个承诺,它会慢慢打印完成的承诺。
但是它们都被打印一次。看起来这些承诺不是一个接一个,而是“一次完成”。在打印第一个控制台日志之前,等待时间很长,然后所有的 Promise 都会打印出来。
所以我希望如果我有一个进度条会增加一点点但很少但会立即增加
内部调用this.eventService.getEventActivitiesAndSomeStreams
return this.afs
.collection('users')
.doc(userID)
.collection('events')
.doc(eventID)
.collection('activities')
.doc(activityID)
.collection('streams', ((ref) => {
return ref.where('type', 'in', typesBatch);
}))
.get()
.pipe(map((documentSnapshots) => {
return documentSnapshots.docs.reduce((streamArray: StreamInterface[], documentSnapshot) => {
streamArray.push(this.processStreamDocumentSnapshot(documentSnapshot)); // Does nothing rather to create an class of the JSON object passed back from the firestore
return streamArray;
}, []);
}))
现在,如果我在 for 循环中放置一个 await,当然这可以正常工作并完成应有的承诺,但是这需要很多时间。
我也试过不使用AngularFire,使用原生的JS SDK效果一样。
我怀疑 IndexedDB 可能会导致这个或其他一些 Firebase 逻辑。
我在这里缺少什么,如果可能的话,我怎样才能获得所需的行为?
您可以通过 ["users" -> "events" -> "something"] firestore 集合复制此内容,如果每个“用户”有 500 个“事件”,并且每个事件还有 2 个文档。
因此,为用户获取所有事件并尝试为每个事件做出一个承诺,该承诺将在 for 数组中返回 2 个“某物”文档)
【问题讨论】:
-
不确定提供的代码是否足够。你能分享完整的
getEventActivitiesAndSomeStreams和processStreamDocumentSnapshot方法吗? -
@DipenShah
processStreamDocumentSnapshot只是一个 JSON 到类实例,只不过是从 JSON 返回中实例化一个对象。getEventActivitiesAndSomeStreams调用我上面写的“基本上”,它只有我在这里硬编码的collection名称等 -
您可以通过“用户”->“事件”->“某事”重现此内容,其中每个“用户”可以说 500 个“事件”,每个事件还有 2 个文档。因此,为用户获取所有事件并尝试为每个事件做出承诺,该承诺将在 for 数组中返回 2 个“某物”文档
-
为什么你会期望这里的东西一一迭代?您在一个 for 循环中激活所有流,这对于人类感知来说几乎是瞬时的,这意味着它们都基本上同时发出请求,因此它们应该基本上同时得到所有响应。您没有 async / await 语句或其他流控制工具告诉它一个一个地执行它们...如果您输入有关您想要发生的任何细节,那么我可以提供帮助,但就目前而言,一切都是行为完全符合预期。
标签: javascript firebase google-cloud-firestore angularfire2