我是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?
感谢任何帮助。
答案 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>