如何在订阅前等待 Observable 完成

Posted

技术标签:

【中文标题】如何在订阅前等待 Observable 完成【英文标题】:How to Wait the Observable to Finish Before the Subscribe 【发布时间】:2018-09-05 11:34:53 【问题描述】:

我编写了 RXJS 运算符来获取位置数组。

这是我的代码:

return  O$ = this.db.list(`UserPlaces/$this.authData.auth.auth.currentUser.uid`, 
    query: 
      orderByChild: 'deleted',
      equalTo: false
    
  )
  .map((locations: any) => 
    return locations.map(location => 
      return location.$key;
    );
  ).switchMap(ids => 
    return ids.map(id => 
      return this.db.object(`Devices/$id`)
    );
  )
  .flatMap((x: any) => 
    return x;
  )
  .map((x:any)=>
     if(!x.deleted)
      return x;
    
  )
  .scan((acc:any, item) => [...acc, item],[])
  .do(console.log)

给定的数组按顺序填充:

[] --> [,] --> [,,] --> [,,,,...]

我需要的是直接获取完整的数组:

[,,,,...]

我尝试使用 forkJoin 但不起作用:

return Observable.forJoin(O$) //but doesn't work.

任何帮助解决这个问题?

谢谢。

【问题讨论】:

好吧,问题是如果源永远不会完成,你怎么知道你什么时候想要发出数组。可能是[,] 还是[,, ]?也许你可以使用auditTime()? reactivex.io/rxjs/class/es6/… 【参考方案1】:

您使用subscribe 方法的全部功能订阅它,并等待complete 回调被调用或抛出错误:

const o$ = (...) // your final observable
let array = null;
o$.subscribe(
    next: value => array = value,
    complete: () => 
        // the operation behind the observable completed. No more values
        // will be yielded. 'array' contains the final values
    ,
    error: (error) => 
        // there was an error. No more values will be yielded
    
);

【讨论】:

感谢您的回复,我在使用您的方式后订阅根本不起作用,在完整和错误阶段 哪个订阅不起作用?我不明白。你已经订阅了 observable?在您的代码中,我没有看到任何订阅。 在写完你的方式之后,我在完整部分中记录了数组,没有出现,我在错误阶段记录了错误,没有出现 你能把订阅observable的代码贴出来吗?【参考方案2】:

将 .scan 改为 reduce()

.map((x:any)=>
 if(!x.deleted)
  return x;

)
  .reduce((acc:any, item) => 
     acc.push(item)
     return acc
,[])

【讨论】:

感谢您的回复,我使用了reduce op后。订阅不起作用 也许将 do() 移到上线调试 reduce 不会发出任何东西,因为源 observable 没有完成。 forkJoin 也是如此。在此之前,您必须完成您的源 observable。 是的,我假设它会完成。我们需要了解更多关于 db api 的信息

以上是关于如何在订阅前等待 Observable 完成的主要内容,如果未能解决你的问题,请参考以下文章

RxJS 等待订阅 Observable 完成

Rxjs:将中间订阅和完整的可观察对象合并,并整体完成

一个一个可观察的 RxJS

Redux-observable:当动作完成时组件如何订阅响应?

如何将 RxSwift 的 Single 转换为 Observable 并忽略“完成”事件?

Angular Universal Render 等待 Http 结果 Observable 订阅者