【问题标题】:How to combine the results of 2 observables as properties on an object?如何将 2 个 observables 的结果组合为对象的属性?
【发布时间】:2021-03-13 00:59:05
【问题描述】:

我有两个都解析为简单字符串的可观察对象。我正在寻找一种不被弃用的方法来获取 2 个 observables 的结果,创建一个对象,并将该对象传递给另一个返回 observable 的方法。

假设我有以下内容:

// both are Observable<string>
name$
age$


// I want this
let body = {
  name: (string result of name$),
  age: (string result of age$)
}

this.httpClient.post<any>("some endpoint", { body: body });


问题:

我必须在创建对象之前订阅字符串 observables 吗?或者这不是最佳实践吗?文档建议使用 zip,但 vscode 告诉我它已被弃用。

【问题讨论】:

    标签: angular rxjs observable


    【解决方案1】:

    在创建对象之前我必须订阅字符串 observables 吗?

    不 :-)

    您可以使用combineLatest 从多个可观察对象创建一个可观察对象,然后使用map 将输出形成一个对象。

    body$ = combineLatest([name$, age$]).pipe(
        map(([name, age]) => ({name, age})
    );
    

    在上面的示例中,body$ 将始终在 name$age$ 发出新值时发出 body 对象。

    然后,您可以使用body$ 作为发起 http 调用的起点。 switchMap 可用于将传入的值 (body) 映射到另一个 observable,然后订阅该 observable。这个“内部可观察”的排放物被排放了。

    result$ = body$.pipe(
        switchMap(body => this.httpClient(url, { body }))
    );
    

    result$ 将发出最近一次 http 调用的结果。

    【讨论】:

    • 这回答了你的问题吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-15
    • 1970-01-01
    • 2019-09-11
    • 1970-01-01
    • 2019-04-19
    相关资源
    最近更新 更多