gpt4 book ai didi

javascript - AngularFire firestore get/snapshotchanges/valuechanges 对可观察对象的操作不是异步的吗?

转载 作者:行者123 更新时间:2023-12-04 08:47:08 25 4
gpt4 key购买 nike

嗨,我有一个非常奇怪的行为。
我正在迭代一些文档并设置一些 promise ,即在获取文档时更新 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 ,它会慢慢地打印已完成的 promise 。
然而,它们都被打印为一次。看起来这些 promise 不是一个一个,而是“一下子”来的。有一个很长的等待时间,直到第一个控制台日志被打印出来,然后所有的 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 当然这可以正常工作并按照它应该的方式完成 promise ,但是这需要很多时间。
我也尝试不使用 AngularFire 并使用具有相同效果的 native JS SDK。
我怀疑 IndexedDB 可能会导致这种或其他一些 Firebase 逻辑。
我在这里缺少什么,如果可能的话,我怎样才能拥有所需的行为?
您可以通过 ["users"-> "events"-> "something"] firestore 集合重现此内容,每个“用户”是否有 500 个“事件”,并且每个事件都有 2 个以上的文档。
因此,获取用户的所有事件并尝试为每个事件做出一个 promise ,该 promise 将在 for 数组中返回 2 个“某物”文档)

最佳答案

这种行为在意料之中,与 firebase 毫无关系。您正在遍历数组并发送请求。项目之间没有等待或延迟,因此 for 循环(没有 await 语句)将在不知不觉中完成的时间很短,这意味着所有请求都在彼此的毫秒内发送出去,或者基本上在同一时间.因此,他们的回应也应该预计会在基本相同的时间到达。
您已经声明您不想使用 await 语句并一一迭代,因此很难确切地知道您想要或期望发生什么。也许您希望它们间隔 0.5 秒?如果是这样,您需要编写该逻辑:

timer(0, 500).pipe( // put whatever ms time between requests you want here?
take(events.length),
switchMap(i => {
return this.eventService.getEventActivitiesAndSomeStreams(this.user,
events[i].getID(),
[DataLatitudeDegrees.type, DataLongitudeDegrees.type]).pipe(take(1))
})
).subscribe(fullEvent => {
this.logger.info(`Promise completed`)
})
(删除的 promise 会导致 idk 为什么首先使用它们,并且使用 rxjs IMO 更容易进行这种控制)

关于javascript - AngularFire firestore get/snapshotchanges/valuechanges 对可观察对象的操作不是异步的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64259300/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com