【问题标题】:Running async functions in sequence with RxJS使用 RxJS 按顺序运行异步函数
【发布时间】:2017-09-10 17:25:20
【问题描述】:

我是 RxJS 的新手,老实说,我很难理解它。所以想我会在这里问,希望有人能把我推向正确的方向。

我正在创建一个服务,该服务需要公开一个进行 2 个异步 http 休息调用的方法,第二个休息调用需要第一个的输出。我会从 service 方法返回一个 promise。

所以 suedo 表示看起来像这样

export class Service {

      isAuthenticated() {
        return new Priomise<any>(resolve => { 
          this.http.post('url')
           .done((result) => {
             this.http.post('url2', { param: data.param })
               .done((result2) => {
                 resolve(result2.json());
               })
           })
       });
  }  
}

您知道实现这一目标的最佳方法是什么吗?

也许我需要使用 toPromise() 运算符?这会取消订阅 Observable 吗?

感谢任何帮助。

【问题讨论】:

    标签: ecmascript-6 rxjs


    【解决方案1】:

    如果您需要从函数中返回 Promise,那么最好使用 Promise。在这种情况下,您不会从 Rx 中受益。

    另外,我在您的代码中清楚地看到了两种反模式。 Deferred for no reason and using promises as callbacks

    因此,使用 Promise,您的代码可能如下所示:

    function getFirstUser() {
      return fetch('https://api.github.com/users') // get list of all users
        .then(response => response.json())
        .then(users => users[0]['login'])
        .then(username =>
          // fetch details of the first user, using his username(login)
          fetch('https://api.github.com/users/' + username)
        )
        .then(response => response.json());
    }
    
    getFirstUser()
      .then(
        user => console.log(user),
        e => console.log('got an error')
      );

    和 RxJS 版本:

    function getFirstUser() {
      return Rx.Observable.ajax('https://api.github.com/users')
        .map(res => res.response)
        .map(users => users[0]['login'])
        .switchMap(username =>
          Rx.Observable.ajax('https://api.github.com/users/' + username)
        )
        .map(res => res.response);
    }
    
    getFirstUser()
      .subscribe(
        user => console.log(user),
        error => console.log('got an error'),
        () => console.log('completed')
      )
    &lt;script src="https://unpkg.com/rxjs/bundles/Rx.min.js"&gt;&lt;/script&gt;

    【讨论】:

    • 感谢您的建议 - 这很有意义并且帮助了我!
    猜你喜欢
    • 2021-11-14
    • 1970-01-01
    • 2019-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-22
    • 1970-01-01
    相关资源
    最近更新 更多