2016-04-06 5 views
0

Meine Angularjs-Anwendung haben einen Controller und Services Java-Skripte. Services rufen WCF-REST-Services mit $ http auf. Ich muss mehrere Dienste in einer For-Schleife basierend auf Daten in Objekt in For-Schleife verwendet aufrufen. Unten ist das Szenario:

"Ich möchte einige Dateien in einen Ordner auf dem Server hochladen und Dateinamen in der Datenbank speichern. Ich habe ein Array von Dateidetails, die Benutzer zum Hochladen ausgewählt. Ich möchte Dateinamen bereits in der Datenbank überprüfen (basierend auf EntityId), benennen Sie die neue Datei vor dem Hochladen auf den Server um. " So unten ist die for-Schleife und Serviceanrufe:

for (var i = 0; i < filesDataToUpload.length; i++) { 

     var fileDataToUpload = filesDataToUpload[i]; 

     FileUploadService.GetUploadDetailsByEntityId(fileDataToUpload.ENTITY_ID).success(function (response) { 
      $scope.UploadDetailsByEntity = response; 
     }); 

     var newFileName = VerifyAndRenameBeforeSave(fileDataToUpload, $scope.UploadDetailsByEntity); 

     FileUploadService.UploadFile(newFileName, fileData).success(function (data) { 
      //some code 
     }).error(function (error) { 
      $scope.error("An error occured while uploading file -" + error.ExceptionMessage); 
      isSuccess = false; 
     }); 

     FileUploadService.InsertUploadDetails(FileUploadDetails).success(function (data) { 
      //some code 
     }).error(function (error) { 
      $scope.error("An error occured while creating the Entity -" + error.ExceptionMessage); 
      isSuccess = false; 
     }); 

    } 

Problem: Problem:

Mein Problem ist - ich habe nicht die Antwort vom ersten Service-Aufruf, die ich in den folgenden Methoden verwenden möchten Überprüfen und Umbenennen der Dateien und Speichern in der Datenbank. Ich fand, dass es wegen des Versprechenverhaltens von $ http ist. Also zog ich meine Datei überprüfen und Umbenennung Methoden und einen Teil der Funktionalität innerhalb der

.success(function(response){ 
//verify that file does not already exists and rename it to the next number of file 
//upload the file to the server 

//Save new file name and other details to the database 
} 

speichert Aber es funktioniert nur für die erste Zeit und nicht die nächste Iteration der for-Schleife. Für die zweite Iteration wird der Datensatz für die erste EntityId abgerufen.

Ich habe bereits this und this

Kann jemand mir helfen, dieses Problem gelöst zu bekommen?

Antwort

1

Es passiert, weil die Funktion .success eine Zusage zurückgibt, während sie tatsächlich auf die Antwort des asynchronen Tasks wartet. Versuchen Sie es so -

+0

Dank @atefth, habe ich versucht, dass tun, aber meine for-Schleife selbst wartet nicht auf die erste Iteration abzuschließen und dann später auf meine .success Ergebnisse zurück. –

+0

Aus verschiedenen Gründen habe ich mich entschieden, meine Implementierungslogik zu ändern, die dieses Problem vermieden. Ich mache es wie folgt: –

+0

1. Verschieben der 'FileUploadService.GetUploadDetailsByEntityId' und' VerifyAndRenameBeforeSave' Logik, um im laufenden Betrieb geschehen, wenn Benutzer jede Datei zum Hochladen ausgewählt (Ich möchte eine Datei auf einmal und nicht mehrere Dateien auswählen). Dies half mir zu vermeiden, dass problematische Serviceaufrufe innerhalb der for-Schleife ausgeführt werden. 2. Ich habe den Rest des For-Schleifencodes in eine Funktion verschoben. 'angular.forEach (filesDataToUpload, function (fileDataToUpload) { Schleife (fileDataToUpload); }, 1000);' –

Verwandte Themen