在 Angular 4 中向服务器发送多个数据 post

Multiple data post to server in Angular 4

我正在构建一些需要能够 运行 离线的应用程序,所以当它处于离线状态时,我将每个数据 post 缓存在本地存储中,当浏览器检测到它在线时,我读取该缓存并开始使用 HttpClient 将所有数据推送到服务器。

问题是这个推送所有的数据都是异步的,导致不是一直按数据0到N的顺序推送,不知道有没有什么算法可以等到第一次推送结束再继续第二次推送?我不想使用 setTimeout,因为它很慢,我想在按顺序 运行 的同时保持快速。

您正在寻找 flatMapmergeMap。这是强制 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);
});

Read More about forkJoin.