2016-09-22 6 views
0

Ich habe einen JSON mit Name, Wert und initial name.Wenn der Benutzer klicken Sie auf Senden Ich überprüfe, ob Wert und Anfangswert gleich oder anders für jedes Element von JSON ist. Wenn der Wert und der Anfangswert nicht gleich sind, rufe ich einen Dienstanruf unter Verwendung von Rxjs an. Wenn Initail-Wert und -Wert für alle Elemente gleich ist, sollte eine Fehlermeldung angezeigt werden, dass "Error-Data nicht geändert wurde". Aber da angular2-Aufrufe asynchron sind, kann ich das nicht.Synchrone Webcalls mit angular2

Mein json ist wie this-

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}]; 

auf Klick auf Absenden-Button Ich rufe diese funktions-

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

Jetzt ist das Problem, wenn ich diese Funktion aufrufen, für Web-Aufruf asynchronen Aufruf ist passiert und der Fluss ging direkt zu if (anyChangeDetected == false) Block und jedes Mal, wenn ich diese Warnung bekomme. Wie kann ich es vermeiden?

Antwort

0

Das ist ein guter Anwendungsfall für forkJoin().

Zunächst einmal erstellen Sie eine temporäre Array mit, dass geänderten Elemente:

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

Wenn changed.length 0 ist, können Sie hier beenden:

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

Dann legt sie und die Abos sammeln:

Jetzt können Sie forkJoin verwenden, um einen Aufruf zu erhalten quit, wenn ALLE asynchronen Anrufe erledigt sind.

// 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 

    }); 
+0

Danke MXII, aber es gibt auch andere Arten von Arbeit muss ich vor und nach dem Service-Aufruf tun für alle Elemente geschieht wie das Laden spinner Animation ... – RHUL

+0

Gibt es eine Möglichkeit Sätze von Arbeit zu tun, vor und nachdem alle Service-Anrufe passiert .. um alles synchron zu machen, um eine gute Kontrolle zu haben, um zu programmieren. – RHUL

+0

Werfen Sie einen Blick auf meine Änderungen, fügte einige Kommentare hinzu. Es gibt keine Möglichkeit, es synchron zu machen, denn Web-Calls sind immer asynchron! :) – mxii