【问题标题】:RxJS / Angular 7 : forkjoin with different callbacksRxJS / Angular 7:具有不同回调的forkjoin
【发布时间】:2019-03-12 09:47:48
【问题描述】:

我对 rxjs 有点陌生(我们已经被 angularJS 困了很长时间,终于摆脱了我们的技术债务)。

使用 angular7,我有一个这样的请求列表。使用 forkJoin,我这样管理它:

let requests = []
for (let asset in this.assets)
{
    if(asset.enabled)
        requests.push(this.apiService.postAsset(oAsset))
}
return forkJoin(requests)

而且效果很好,我收到了一系列回复。 然而我有点难以弄清楚如何根据资产类型获得不同的回调。 我想要类似的东西

private saveAssets(): Observable<any>{
    let requests = []
    for (let asset in this.assets)
    {
      //asset exists already
      if(asset.id)
      {
        requests.push(this.apiService.putAsset(asset)
          .subscribe(response => {
           // do something with asset
          }))
      }
      else
      {
        requests.push(this.apiService.postAsset(asset)
          .subscribe(response => {  
            asset.id = response.id
            // do some more thing with asset
          }))
      }
    }
    return forkJoin(requests)
    //keep the forkjoin because I want to do something when everything is done
}

但这行不通。给出错误 ERROR TypeError: You provided an invalid object where a stream was expected. You can provide an Observable, Promise, Array, or Iterable. 与调用执行请求的函数相关,如下所示(没有单个“订阅”,它工作正常):

this.saveAssets()
    .subscribe(responses => {
        console.log(responses)
    })

任何帮助或提示,将不胜感激......我将分配更多时间学习 RxJS,但现在我只是想让这个小东西在不太 -肮脏的方式。

非常感谢!

【问题讨论】:

  • 我正在查看语法,但这里没有发现问题。您确定没有任何请求出错吗?
  • 嗨@jriver27,谢谢!是的,每个调用都由 api 正确执行。

标签: angular typescript rxjs fork-join


【解决方案1】:

订阅 observable 将返回 Subscription。但是 forkjoin 将期望观察到的数组。在您的情况下,这将是一个订阅数组。对每个请求使用map 运算符,如下所示解决您的问题。

let requests = []
for (let asset in this.assets)
{
  //asset exists already
  if(asset.id)
  {
    requests.push(this.apiService.putAsset(asset)
      .pipe(map(response => {
           // do something with asset or alter the response from here
          return response; 
         })
        ));
  }
  else
  {
    requests.push(this.apiService.postAsset(asset)
       .pipe(map(response => {
         // do something with asset or alter the response from here
         return response; 
      })));
  }
}
return forkJoin(requests).

地图运算符将您选择的功能应用于每个项目 由源 Observable 发出,并返回一个发出的 Observable 这些函数应用的结果。

如果您不想更改最终结果,请使用tap 运算符。

【讨论】:

  • 非常感谢!有用 !我已经尝试了 map 运算符但没有成功,但我猜我的语法不正确。
猜你喜欢
  • 2019-12-14
  • 2022-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-26
  • 1970-01-01
相关资源
最近更新 更多