使用RxJS按顺序运行异步函数

时间:2017-09-09 15:50:09

标签: ecmascript-6 rxjs

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

我正在创建一个需要公开一个方法来进行2个异步http休息调用的服务,第二个休息调用需要第一个的输出。我将从服务方法中返回一个承诺。

所以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?

感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

如果你需要从你的函数返回Promise,那么最好使用promises。在这种情况下,您不会受益于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')
  )
<script src="https://unpkg.com/rxjs/bundles/Rx.min.js"></script>