在 Angular 4 中向服务器发送多个数据 post
Multiple data post to server in Angular 4
我正在构建一些需要能够 运行 离线的应用程序,所以当它处于离线状态时,我将每个数据 post 缓存在本地存储中,当浏览器检测到它在线时,我读取该缓存并开始使用 HttpClient 将所有数据推送到服务器。
问题是这个推送所有的数据都是异步的,导致不是一直按数据0到N的顺序推送,不知道有没有什么算法可以等到第一次推送结束再继续第二次推送?我不想使用 setTimeout,因为它很慢,我想在按顺序 运行 的同时保持快速。
您正在寻找 flatMap
或 mergeMap
。这是强制 REST 同步的最简单方法之一。
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
});
});
});
这样,只有第一次推送完成,第二次才会开始,依此类推
我认为 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);
});
我正在构建一些需要能够 运行 离线的应用程序,所以当它处于离线状态时,我将每个数据 post 缓存在本地存储中,当浏览器检测到它在线时,我读取该缓存并开始使用 HttpClient 将所有数据推送到服务器。
问题是这个推送所有的数据都是异步的,导致不是一直按数据0到N的顺序推送,不知道有没有什么算法可以等到第一次推送结束再继续第二次推送?我不想使用 setTimeout,因为它很慢,我想在按顺序 运行 的同时保持快速。
您正在寻找 flatMap
或 mergeMap
。这是强制 REST 同步的最简单方法之一。
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
});
});
});
这样,只有第一次推送完成,第二次才会开始,依此类推
我认为 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);
});