将RxJS Observable转换为Promise
问题描述:
我试图使用多个http调用将数据存储在本地存储中。我使用forkJoin等到所有呼叫都已完成,然后我想恢复我的Promise.then
呼叫链。我该怎么做呢?将RxJS Observable转换为Promise
updateCache() {
var cachesToUpdate;
return this.fetchServerTimestamps()
.then(res => {
var localTimestamps = this.getLocalTimestamps();
var serverTimestamps = this.getServerTimestamps();
//Compare timestamps and decide which cache data types to update
cachesToUpdate = this.cacheTypes.filter(function (cacheType) {
return localTimestamps ? localTimestamps[cacheType.timestamp] != serverTimestamps[cacheType.timestamp] : true;
});
}).then(res => {
//Request data and insert into cache
this.fetchData(cachesToUpdate)
.subscribe(res => {
res.forEach(function (item, index) {
this.insert(cachesToUpdate[index].messageType, JSON.stringify(item));
}.bind(this));
});
});
}
fetchData(cachesToUpdate): Observable<any> {
return forkJoin(cachesToUpdate.map(i => this.callservice.serverRead({ path: 'api/' + i.messageType })));
}
insert(key: string, value: string, compress = true) {
localStorage.setItem(key, compress ? LZString.compress(value) : value);
}
答
可以使用的Observable
toPromise()
方法
https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/topromise.md
this.fetchData(cachesToUpdate).toPromise().then(...)
编辑:如FriOne & Lyubimov罗马在c提到omment,别忘了
import 'rxjs/add/operator/toPromise';
不要忘记'输入“rxjs/add/operator/toPromise”;' –