为什么启动后无法在firebase中的递归get()上正常工作?

时间:2019-03-21 16:46:42

标签: javascript firebase google-cloud-firestore

简而言之:startAfter()在给定特定顺序的最后一个对象时,应该返回空结果(我认为),但不是。为什么不呢?)

我有一个大集合,需要定期维护。我想通过批量读取,批量写入然后递归进行来实现。
我认为我已经建立了正确的结构,如下所示(最终将是云代码。我正在浏览器中运行它,以避免使用云痛苦 build-deploy-test循环)< / p>

function cleanupFoos(startAfter) {
  let query = db.collection('myCollection').orderBy('createdAt').limit(200)
  if (startAfter) query.startAfter(startAfter)
  return query.get().then(querySnapshot => {
    startAfter = _.last(querySnapshot.docs)
    let batch = db.batch()
    let promises = querySnapshot.docs.map(doc => cleanupFoo(doc, batch))
    return Promise.all(promises).then(() => batch)
  }).then(batch => {
    return batch.commit()
  }).then(() => {
    return startAfter ? cleanupFoos(startAfter) : null
  })
}

function cleanupFoo(doc, batch) {
  // return a promise
}

// call it
cleanupFoos()

但是此代码无限循环。看着调试器中的单个文档集合(myCollection: [ { just this one doc } ]),我在第一次调用时得到了那个文档。这也是最后一个文档,所以

startAfter = _.last(querySnapshot.docs) // --> { just this one doc }

在递归调用上,我可以看到startAfter设置为我期望的值:第一个(也是最后一个)文档。我的期望是,get()现在应该返回一个空的querySnapshot。但是它会返回相同的单个文档,触发另一轮,然后触发另一轮。...错了,对吧?

0 个答案:

没有答案