【问题标题】:Using Angular 2 Observable Data使用 Angular 2 可观察数据
【发布时间】:2017-12-02 04:00:33
【问题描述】:

我对 Angular 2 非常陌生,并试图了解我需要在我的应用程序中使用的基本结构。我编写了代码来对 PHP 脚本执行 http get 请求,该脚本从我的数据库返回一些 JSON 数据。这是作为我订阅的 observable 编写的,并且可以很好地显示模板中的值。但是,一旦此数据完成下载(或正在下载?),我需要从 JSON 数组的每个元素中提取一个 UNIQUE 值,并在另一个 http get 上的查询字符串中使用该值。考虑存储在数据库中的股票代码,然后运行第二次 get 从 REST 服务中检索股票数据。股票代码可能会重复很多次,所以我只想对每个 UNIQUE 值执行第二个 http get 请求(例如,只从 REST 服务获取一次 MSFT)。

需要循环从这些股票数据中返回的数据以提取特定的数据值,其中一些将完全按原样使用,而另一些将用于计算,并显示其结果。

如何构建代码来完成这些额外的计算?

我的代码目前看起来像这样(显然 console.log 是用于调试目的):

ngOnInit() {
    this._tradeService.getTradeData()  // get database data
        .subscribe(
          res => this.mspTradeData = res,
          error => alert(error),
          () => console.log(this.mspTradeData)
        );

    // TODO
    // get unique symbols for REST service queries
}

任何提示或指导将不胜感激。

【问题讨论】:

  • 股票代码可能会重复很多次,所以我只想对每个 UNIQUE 值执行第二次 http get 请求(例如,只从 REST 服务获取一次 MSFT)。这是什么意思 。休息调用将仅返回 pone 值或值数组什么是结构。因为这是您使用flatMap 的情况
  • 你可以这样做:this.tradeService.getTradeData().subscribe(res => { this.data = res; this.data.forEach(x => { this.tradeService.anotherFunction (x.property).subscribe()}),错误...

标签: angular observable


【解决方案1】:

这是一个比较高级的RxJs问题,涉及到几个算子,但我尽量简单解释一下。

如果我理解正确,您正在寻找的步骤是:

  1. 进行服务调用,返回数组的 Observable - 让我们调用数组 'TradeData' 中的类型,因此服务返回 Observable<TradeData[]>

  2. 将单个发出的 TradeData 数组转换为 TradeData 项流。

  3. 从 TradeData 项目流中提取股票代码

  4. 从上一步获取一组唯一的股票代码

  5. 为每个唯一的股票代码进行服务调用

  6. 将步骤 4 中调用的所有结果收集到一个位置。

这看起来像:

this._tradeService.getTradeData() // 1. make the api call
  .concatAll() // 2. convert stream of single item to stream of items
  .map(tradeDatum => tradeDatum.stockSymbol) // 3. extract the stock symbols
  .distinct() // 4. filter the stock symbols to a unique list
  .flatMap(stockSymbol => getStockData(stockSymbol) // 5. get the data for each stock symbol
  .toArray() // 6. collect the stream items into an array
  .subscribe(console.log)

请注意,与简单地订阅初始调用然后为每个项目进行服务调用相比,一个主要优势是您可以在一个地方获得整个结果,并且您还可以在一个地方处理所有错误。

【讨论】:

  • 感谢您的信息。我已经实施了这些建议,但我仍然有一个问题。我的 Observable getTradeData 正在返回一个 Observable ,它没有可用的 .concatAll() 方法。我还没有弄清楚如何让我的 getTradeData 方法返回一个 TradeData[] 流。你能解释一下这是怎么做到的吗?
  • 假设您正在进行 HTTP 调用,您真正需要做的就是指定 getTradeData 函数的返回类型。还可以对http调用本身的返回类型进行注解,例如this.http.get<TradeData[]>('http://service')
猜你喜欢
  • 2017-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-21
  • 2018-07-10
  • 2016-06-04
  • 2017-05-24
  • 1970-01-01
相关资源
最近更新 更多