【问题标题】:Multiple data post to server in Angular 4Angular 4中的多个数据发布到服务器
【发布时间】:2018-05-15 03:25:23
【问题描述】:

我正在构建一些需要能够脱机运行的应用程序,因此当它脱机时,我会将每个数据帖子缓存在本地存储中,当浏览器检测到它在线时,我会读取该缓存并开始将所有数据推送到服务器使用 HttpClient。

问题在于异步推送所有数据,使其并不总是按数据 0 到 N 的顺序推送,我想知道是否有某种算法在继续第二次推送之前等待第一次推送结束?我不想使用 setTimeout,因为这很慢,我想在让它按顺序运行的同时保持快速。

【问题讨论】:

    标签: angular angular4-httpclient


    【解决方案1】:

    我认为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.

    【讨论】:

    • 啊,谢谢,这就是我要找的,它会按顺序发送所有推送数据并等待所有推送数据完成,这样我就可以通知用户他们的所有数据都已推送。感谢您的回答。
    【解决方案2】:

    您正在寻找flatMapmergeMap。这是强制 REST 同步的最简单方法之一。 How to chain Http calls in Angular2

    【讨论】:

    • 这也适用于我的问题,但我现在选择使用 Sangwin 的使用 forkjoin 的答案,因为如果所有数据都被推送,我需要通知用户,谢谢你的回答:)
    • @CharlesRandicha 嘿,别担心!嘿,接受了我的回答,为你做了一篇高质量的帖子,值得加分。我来这里是为了帮助人们学习,以便他们可以帮助人们。 GL 在您的开发之旅中
    【解决方案3】:
    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
                });
        });
    });
    

    这样,只有第一次推送完成后,第二次才会开始,以此类推。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-27
      • 2013-07-16
      相关资源
      最近更新 更多