【问题标题】:How to chain rxjs observable如何链接rxjs observable
【发布时间】:2016-03-29 16:47:49
【问题描述】:

我来自 Angular1,并且像链接承诺一样,我希望有类似的行为。

我在 someclass 中有一个方法:-

{.........
      doLogin (username, password) {
            .......
            .......
            return this.http.get(api).subscribe(
                    data => {.....}, //enters here
                    err => {.....}
        }

然后我调用这个方法:-

 someclass.doLogin(username, password).subscribe(
           data => { }, //Not getting called
            err => { }
 }

正如我在上述代码中作为 cmets 所提到的,订阅不会在调用者类中被调用。

关于如何做到这一点的任何建议?

【问题讨论】:

    标签: angular rxjs


    【解决方案1】:

    实际上,您返回的是subscribe 方法的对象。这是订阅而不是可观察的。因此,您将无法(再次)订阅返回的对象。

    Observables 允许基于 observable 算子构建数据流链。这取决于你想做什么。

    如果您只是简单地触发某事或从您的服务设置服务属性,您可以使用do 运算符和catch 一个进行错误处理:

    doLogin (username, password) {
      .......
      .......
      return this.http.get(api).do(data => {
        .....
        // Call something imperatively
      })
      .catch(err => {
        .....
        // Eventually if you want to throw the original error
        // return Observable.throw(err);
      });
    }
    

    不要忘记包含这些运算符,因为 Rxjs 没有开箱即用地包含它们:

    import 'rxjs/add/operator/do';
    import 'rxjs/add/operator/catch';
    

    或全局(所有运算符):

    import 'rxjs/Rx';
    

    查看相关问题:

    【讨论】:

    • 这成功了!只是我想知道什么时候会调用 catch-err 部分?因为,当出现 500 错误时,我期待 catch 部分会被调用...
    • 如果根据状态码(>=200 && github.com/angular/angular/blob/master/modules/angular2/src/…
    • 在500状态码的情况下,应该调用失败回调&用catch操作符指定的...
    • 我还是不知道怎么上链。我希望在您的“do”函数中处理 api 响应后,我想向订阅者返回一些其他值(例如 - 'foo') - 即在这种情况下,“someclass.doLogin”中的“数据” (在我的问题上方)将具有该返回值(即 foo)。
    • 如果要上链,需要使用flatMap操作符:return this.http.get(api).flatMap(data => this.http.get(api));。这种情况下,订阅回调会收到第二次get的结果...
    猜你喜欢
    • 2018-02-05
    • 1970-01-01
    • 2020-03-28
    • 1970-01-01
    • 2019-06-14
    • 1970-01-01
    • 2021-01-11
    • 2016-12-26
    • 1970-01-01
    相关资源
    最近更新 更多