将 RxJS Observable 转换为 Promise

2024-01-09

我正在尝试使用多个 http 调用将数据存储在本地存储中。我使用 forkJoin 等待所有调用完成,然后我想恢复我的Promise.then调用链。我该怎么做呢?

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);
}

您可以使用toPromise()的方法Observable

https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/topromise.md https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/topromise.md

this.fetchData(cachesToUpdate).toPromise().then(...)

Edit: as FriOne & 柳比莫夫·罗曼评论里提到了,别忘了

import 'rxjs/add/operator/toPromise';
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 RxJS Observable 转换为 Promise 的相关文章

随机推荐