2016-05-26 3 views
0

У меня есть группы задач, у этих групп есть задачи. Вы можете добавлять существующие задачи в свою группу, но также создавать новые. Эти новые не имеют _id еще в моем mongoDB, поэтому я должен сделать их первыми, прежде чем сделать мой вызов createTaskGroup.дождаться асинхронных HTTP-запросов перед продолжением углового

Когда я вызываю createTaskGroup, я просматриваю задачи, когда нет _id, я вызываю «addnewtask». Проблема в том, что последняя функция «apiFactory.createTaskGroup» вызывается до того, как цикл будет выполнен для выполнения не существующих задач.

Как можно дождаться завершения этих функций перед выполнением createTaskGroup?

dvm.createTaskGroup = function(){ 
     for (var i = 0; i < dvm.taskgroup.tasks.length; i++) { 
      if (angular.isUndefined(dvm.taskgroup.tasks[i]._id)) { 

       apiFactory.addNewTask(dvm.taskgroup.tasks[i].description, function (response) { 
        dvm.taskgroup.tasks[i] = response; 
       }); 
      } 
     } 

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

    }; 

Я также пробовал использовать обещания, обычно я использую обратные вызовы, но я читал о $ q.all. Поэтому я бы дал ему шанс. Но потом я могу жаловаться на корс, даже это тот же призыв, что и раньше, но с использованием обещания.

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

    }; 

Здесь находится сообщение http.

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

Можете ли вы опубликовать свой заводской код? Вероятно, вы захотите воспользоваться обещаниями. –

+0

Ты имеешь в виду мое обслуживание? последним блоком кода является мое обслуживание. Я знаю, что моя архитектура не на месте. Это для моей стажировки, до апреля у меня не было никакого опыта с угловатым, даже javascript вообще, я был очень рад, что все сработало. – user1008531

ответ

0

получил его на работу. Я возвращаю мой HTTP вызов как обещание, вместо того чтобы сделать переменную для него

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

Вызов функции «createtaskgroup» в «то» заявление моего $ q.all. Не могу объяснить детали, почему это работает сейчас, без переменной temp для моего обещания, я не получил ошибку CORS, возможно, кто-то здесь, который мог бы объяснить, почему.

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

Вы должны быть в состоянии просто назвать так:

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

Если длина = 3, выполняются ли 3 вызова до того, как вызывается «createTaskGroup»? Мне кажется, что это не так – user1008531