我正在构建一些需要能够离线运行的应用程序,所以当它离线时我会缓存localstorage中的每个数据帖子,当浏览器检测到它在线时,我读取该缓存并开始使用HttpClient将所有数据推送到服务器。
问题是这会异步推送所有数据,使得它并不总是按数据0到N的顺序推送,我想知道是否有一些算法在继续第二次推送之前等待第一次推送结束?我不想使用setTimeout,因为这很慢,我希望在按顺序运行时保持快速。
答案 0 :(得分:2)
我认为forkJoin是您可以在这里使用的好方法。
您可以在数组中添加所有请求,如下所示
constant allSavedRequests = [];
allSavedRequests.push(this.http.get('https://testdb1.firebaseio.com/.json'));
allSavedRequests.push(this.http.get('https://testdb2.firebaseio.com/.json'));
现在使用forkJoin可以绑定一个变量
中的所有请求const runRequests = Observable.forkJoin(allSavedRequests)
最后,当你在线时,你需要调用forkJoin调用,它会一次性发出所有请求。
runRequests.subscribe(latestValues => {
console.log( "data_all" , latestValues);
});
答案 1 :(得分:1)
您正在寻找flatMap
或mergeMap
。这是强制REST同步的最简单方法之一。 How to chain Http calls in Angular2
答案 2 :(得分:0)
this._service.push1(push1data)
.subscribe(
(result) => { this.something = result },
error => { this.errorMessage = <any>error; },
() => {
this._service.push2(push2data)
.subscribe(
(result) => { this.something2 = result },
error => { this.errorMessage = <any>error; },
() => {
this._service.push3(push3data)
.subscribe(
(result) => { this.something3 = result },
error => { this.errorMessage = <any>error; },
() => {
// and so on
});
});
});
这样,只有在第一次推送完成后,才会启动第二次,依此类推。