0

ユーザーが送信をクリックすると、jsonの各要素の値と初期値が同じか異なるかを確認しています。値と初期値が同じでない場合は、Rxjs を使用してサービス コールを呼び出しています。initail の値と値がすべての要素で同じである場合、「Error-Data is not changed」というエラー メッセージが表示されます。

私の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");
      }
    }

今問題は、この関数を呼び出すときです。Web 呼び出しの非同期呼び出しが発生し、フローが 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 に答える