javascript - AngularFire firestore get/snapshotchanges/valuechanges 对 observable 的操作不是异步的?

标签 javascript firebase google-cloud-firestore angularfire2

嗨,我有一个非常奇怪的行为。

我正在迭代一些文档并设置一些 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 循环中放置一个等待,当然这会正常工作并完成应有的 promise ,但需要花费很多时间。

我也尝试过不使用AngularFire而使用原生JS SDK,效果相同。

我怀疑 IndexedDB 可能会导致此逻辑或其他一些 Firebase 逻辑。

我在这里缺少什么?如果可能的话,我怎样才能获得所需的行为?

您可以通过 ["users"-> "events"-> "something"] firestore 集合来重现此内容,每个“用户”有 500 个“事件”,并且每个事件都有 2 个以上文档。

因此,获取用户的所有事件,并尝试为每个事件做出一个 promise ,该 promise 将在 for 数组中返回 2 个“某物”文档)

最佳答案

这种行为是符合预期的,与 firebase 无关。您正在迭代数组并发送请求。项目之间没有等待或延迟,因此 for 循环(没有 wait 语句)将在难以察觉的短时间内完成,这意味着所有请求都在彼此之间的几毫秒内发送出去,或者基本上同时发送出去。因此,他们的回复预计也会基本同时到达。

您已经声明您不想使用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 会导致我不知道为什么要首先使用它们,并且在我看来,使用 rxjs 更容易进行这种控制)

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

相关文章:

javascript - 为 Grunt 连接服务器配置别名目录

javascript - 无法获取动态 document.getElementById 值

javascript - 分配数组值不起作用?

android - 如何以相反的顺序从 Firestore 中检索按顺序排列的数据?

javascript - Firebase Functions 错误 : . once is not a function

android - 无法连接 : A sign-in error occurred. com.firebase.ui.auth.data.model.UserCancellationException:

javascript - 需要帮助从网站上删除 iFrame 黑客吗?

firebase - 有什么方法可以配置 firestore 数据库吗?

flutter - 判断同一个gmail登录用户数,flutter cloudfirestore

reactjs - firebase2.default.firestore 不是一个函数 - React Firebase