2016-05-26 12 views
0

Ich habe Arbeitsgruppen, wobei diese Gruppen haben Aufgaben. Sie können vorhandene Aufgaben zu Ihrer Gruppe hinzufügen, aber auch neue hinzufügen. Diese neue haben keine _id noch in meinem mongoDB, also muss ich sie zuerst machen, bevor mein createTaskGroup Anruf.für Asynchron-HTTP-Anfragen warten, bevor Sie fortfahren Winkel

Als ich createTaskGroup nennen, ich Schleife durch die Aufgaben, wenn es keine _id ist, nenne ich „addnewtask“. Das Problem ist, dass die letzte Funktion "apiFactory.createTaskGroup" vor der Schleife aufgerufen wird, um nicht existierende Aufgaben zu erledigen.

Wie kann ich warte auf diese Funktionen vor createTaskGroup Ausführung zu beenden?

Ich versuchte auch mit Versprechungen, normalerweise verwende ich Rückrufe, aber ich lese über $ q.all. Also würde ich es versuchen. Aber dann kann ich mich über die cors beschweren, sogar es ist der gleiche Ruf wie zuvor, aber mit dem Einsatz von Versprechen. Hier

dvm.createTaskGroup = function(){ 
     var callsToWaitForBeforeContinue = []; 

     var tempArrayWithTasksWithId = []; 

     angular.forEach(dvm.taskgroup.tasks, function(task){ 
      if(angular.isUndefined(task._id)){ 
       callsToWaitForBeforeContinue.push(apiFactory.addNewTaskWithPromise(task.description)); 
      } 
      else{ 
       tempArrayWithTasksWithId.push(task); 
      } 
     }); 

     $q.all(callsToWaitForBeforeContinue).then(function(req){ 
      dvm.taskgroup.tasks = tempArrayWithTasksWithId; 

      angular.forEach(req, function(singlePromise){ 
       dvm.taskgroup.tasks.push(singlePromise); 
      }); 
     }); 
      apiFactory.createTaskGroup(dvm.taskgroup, function (response) { 
       $mdDialog.hide(dvm.taskgroup); 
      }); 

    }; 

ist die http Post selbst.

var addNewTaskWithPromise = function(taskDescription){ 
      var q = $q.defer(); 

      $http.post(ENV.api + 'tasks/', taskDescription).then(function(response){ 
       q.resolve(response); 
      }, errorCallback); 

      return q.promise; 
     }; 
+0

Können Sie Ihren Werkscode auch posten? Das ist wahrscheinlich, wo Sie Versprechen nutzen wollen. –

+0

meinst du meinen Service? Der neueste Codeblock ist mein Service. Ich weiß, dass meine Architektur nicht auf den Punkt kommt. Es ist für mein Praktikum, vor April hatte ich keine Erfahrung mit eckigen, sogar Javascript im Allgemeinen, ich war sehr glücklich, dass alles funktioniert hat. – user1008531

Antwort

0

habe es zu arbeiten. Ich kehre meine http Ruf als ein Versprechen, sondern eine Variable machen es

var addNewTaskWithPromise = function(taskDescription) { 
     return $http.post(ENV.api + 'tasks', { 
      "description": taskDescription 
     }); 
    }; 

Rufen Sie die Funktion "createtaskgroup" in der "dann" statement of my $ q.all. Kann nicht wirklich die Details erklären, warum es jetzt, ohne die temporäre Variable für mein Versprechen funktioniert, habe ich nicht einen CORS Fehler, wahrscheinlich jemand hier erhalten, warum erklären könnte.

dvm.createTaskGroup = function() { 
     var callsToWaitForBeforeContinue = []; 

     var tempArrayWithTasksWithId = []; 

     angular.forEach(dvm.taskgroup.tasks, function(task) { 
      if (angular.isUndefined(task._id)) { 
       callsToWaitForBeforeContinue.push(apiFactory.addNewTaskWithPromise(task.description)); 
      } else if(angular.isDefined(task._id)) { 
       tempArrayWithTasksWithId.push(task); 
      } 
     }); 

     $q.all(callsToWaitForBeforeContinue).then(function(req) { 
      dvm.taskgroup.tasks = tempArrayWithTasksWithId; 

      angular.forEach(req, function(singlePromise) { 
       dvm.taskgroup.tasks.push(singlePromise.data.task); 
      }); 

      apiFactory.createTaskGroup(dvm.taskgroup, function(response) { 
       $mdDialog.hide(dvm.taskgroup); 
      }); 
     }); 

    }; 
0

sollten Sie in der Lage sein, genau wie so zu nennen:

apiFactory.addNewTaskWithPromise(task.description).then(function(response){ 
    dvm.taskgroup.tasks[i] = response; 
    apiFactory.createTaskGroup(dvm.taskgroup).then(function (response2) { 
     $mdDialog.hide(dvm.taskgroup); 
    }); 
}); 
+0

Wenn Länge = 3, wird die 3 Anrufe beendet, bevor „createTaskGroup“ genannt? Ich sehe nicht so aus – user1008531