У меня есть группы задач, у этих групп есть задачи. Вы можете добавлять существующие задачи в свою группу, но также создавать новые. Эти новые не имеют _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;
};
Можете ли вы опубликовать свой заводской код? Вероятно, вы захотите воспользоваться обещаниями. –
Ты имеешь в виду мое обслуживание? последним блоком кода является мое обслуживание. Я знаю, что моя архитектура не на месте. Это для моей стажировки, до апреля у меня не было никакого опыта с угловатым, даже javascript вообще, я был очень рад, что все сработало. – user1008531