RxFire handels firestore如何查询

这个 js reduce 可以很好地处理查询结果:


function toc(current) {

  return {....};

};

function getToc(data) {

  return = data.reduce((a, c) => Object.assign(a, {[c.id]: toc(c)}), {});

};


const query = db.collection(normCollection)

.where('a_id', '==', a_id )

.where('year', '==', year) 

.orderBy("id");

subscriptionNorm = collectionData(query, "id")

.subscribe(data => console.log(getToc(data)));

但是当我使用 RxJs reduce 时,它停止工作了。它与流结束有关,但是......但是我不明白 RxFire / RxJs 如何处理流式 firestore 查询结果:


...

subscriptionNorm = collectionData(query, "id")

.pipe(reduce((a, c) => Object.assign(a, {[c.id]: toc(c)}), {}))

.subscribe(data => console.log(data));

更新这个工作正常,但是......:


...

subscriptionNorm = collectionData(query, "id")

.pipe(

  map(v => v.reduce((a, c) => 

    Object.assign(a, {[c.id]: toc(c)}), {})

  ),

)

.subscribe(data => console.log(data));


白猪掌柜的
浏览 146回答 1
1回答

慕盖茨4494581

您对 rxjs reduce 运算符的假设是正确的。“在源 Observable 上应用累加器函数,并在源完成时返回累加结果”——来自文档,请参见此处:RxJS reduce docs在您的情况下,源不会完成,因为这就是 Firestore 的工作方式,它会无休止地运行而不会完成,直到发生错误或您手动取消订阅。take(1)举一个粗略的例子,你可以在管道内使用运算符,它会在发出 1 个事件后完成源 Observable,因此它reduce会起作用,但它扼杀了 Firestore Observable 背后的主要思想。这是您可以使用 rxjs 运算符的方式reduce:subscriptionNorm = collectionData(query, "id").pipe(  switchMap(data => from(data).pipe(    reduce((a, c) => Object.assign(a, { [c.id]: toc(c) }), {})  )),).subscribe(data => console.log(data));这是可能的,因为我正在切换到from(data)并且内部 Observable 将完成,因此reduce操作员将按您的预期工作。但是,老实说,这是一种矫枉过正,你可以简单地保持你已经实施的方式:subscriptionNorm = collectionData(query, "id").pipe(  map(data => data.reduce((a, c) => Object.assign(a, { [c.id]: toc(c) }), {}))),).subscribe(data => console.log(data));
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript