0

我有一个具有名称、值和初始名称的 json。当用户单击提交时,我正在检查 json 的每个元素的值和初始值是相同还是不同。如果值和初始值不同,那么我正在使用 Rxjs 调用服务调用。如果所有元素的初始值和值都相同,则应显示错误消息“错误数据未更改”。但由于 angular2 调用是异步的,我无法做到这一点。

我的json是这样的-

this.subscriptionList= [{name:"Chat Integration",value:false,initialValue:false},{name:"Dashboard Functionality",value:false,initialValue:false},
{name:"Quarterly Maintenance Window",value:false,initialValue:false},{name:"Remedy Planned Outages",value:false,initialValue:false},
{name:"Schedule Integration",value:false,initialValue:false}];

单击提交按钮时,我正在调用此函数-

    submitData()
    {
      var anyChangeDetected: boolean = false;
      for(var i=0;i<this.subscriptionList.length;i++)
      {
        if(this.subscriptionList[i].value != this.subscriptionList[i].initialValue)
        {
          anyChangeDetected = true;
          this.remedyService.submitSubscription(this.subscribeObject).subscribe(
            data =>{

            },
            err=>{

            },
            ()=>{

            });
        }
      }

      if(anyChangeDetected == false)
      {
          alert("Data is not changed");
      }
    }

现在的问题是当我调用这个函数时,网络调用发生了异步调用,流程直接进入 if(anyChangeDetected == false) 块,每次我收到那个警报。我怎样才能避免它?

4

1 回答 1

0

这是一个很好的用例forkJoin()

首先创建一个具有更改元素的临时数组:

let changed = this.subscriptionList.filter(i => i.value != i.initialValue);

如果changed.length为 0,则可以在此处退出:

if (!changed.length) {
   alert("Data is not changed");
   return; // we can stop..
}

然后提交它们并收集订阅:

let subs = changed.map(i => this.remedyService.submitSubscription(i));

现在,当所有异步调用完成时,您可以使用它forkJoin来获取回调。

// DO EVERYTHING BEFORE SUBMITTING RESULTS

Observable.forkJoin(subs).subscribe(
   subResults => {
      // all subscribtions done .. 
      let result1 = subResults[0]; // result of first subscribtion
      let resultx = subResults[x]; // result of x'th subscribtion

      // DO EVERYTHING AFTER ALL SUBMITTED

   });
于 2016-09-22T17:37:05.623 回答