【问题标题】:angular rxjs: access parameter on http error inside pipe/concatMap?angular rxjs:在管道/concatMap 中访问 http 错误的参数?
【发布时间】:2018-09-26 17:41:55
【问题描述】:

我目前正在使用 pipe 和 concatMap 来链接多个 http 请求,如下所示:

onErrorResumeNext(from(ids))
    .pipe(
        delay(10),
        concatMap(id => get(id))
    )
    .subscribe(res => {
        if (res = emptydata) return id
});

get 函数处理从 id 数组构建查询字符串,还包含 retry 和 catchError。

现在,问题是如果我没有得到关于响应对象的数据,我需要访问相同的 id 参数。

有什么想法吗?

【问题讨论】:

  • 需要在哪里访问id参数?
  • 订阅后。这不是一个真正的 http 错误,因为我确实得到了响应。它只是一个空对象。订阅后我有一个 if-else 语句可以检查它。如果为真,我需要找出它是哪个 ID。
  • “订阅后”是什么意思?订阅后你不能做任何事情,因为它是异步的。您必须在订阅回调中处理它。
  • 是的,一旦响应返回订阅回调。我已经编辑了这个问题。我不确定这是否会影响它,但订阅发生在组件中,但是,管道是从服务返回的。

标签: angular http rxjs observable


【解决方案1】:

concatMap(和其他高阶 Observable 运算符)采用可选的结果选择器函数(注意:不推荐使用),该函数采用输出值和输入值参数。这允许您将两者都传递给流(例如作为数组):

onErrorResumeNext(from(ids))
    .pipe(
        delay(10),
        concatMap(id => get(id), (res, id) => ([res, id]))
    )
    .subscribe(([res, id]) => {
        // note that `return` does nothing here
        if (res == emptydata) return id
});

如果 get 是一个 Observable,你也可以在你可以访问它的上下文中返回 id

concatMap(id => get(id).pipe(
  map(res => res != emptydata ? res : id)
)

如果get不是数组,可以使用from等Observable创建函数将其转为数组。

【讨论】:

  • 会试试这个。谢谢!
  • 请注意,自 v5/v6 以来,大多数运算符已弃用结果选择器。请在您的回答中考虑这一点。
  • @Jota.Toledo 我不知道 resultSelector 被弃用;谢谢你指出这一点。除了我在concatMap 回调函数上下文中工作的其他建议之外,我不知道另一种方法来处理这个问题。
  • 我阅读了关于 resultSelector 及其弃用的信息。之前并不真正了解如何/何时使用它。但是,因为它对我有用。我会尽可能使用它。
  • @JignoAlfredVenezuela github.com/ReactiveX/rxjs/blob/master/docs_app/content/guide/v6/… 解释了如何迁移,我的第二个代码示例针对您的情况。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-10-16
  • 1970-01-01
  • 2021-12-17
  • 1970-01-01
  • 2018-04-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多