2015-12-09 4 views
2

Я пытаюсь обнаружить, если инструкция foreach завершена вместе с утверждениями внутри foreach. Из моих исследований многие просят использовать обещания. Поскольку я реализован, он не выполняется так, как я ожидал.Angular.foreach асинхронный обратный вызов не работает

var uploadUrl = "/api/upload"; 
$('#add_product').closeModal(); 
var promises = angular.forEach(vm.images_selected, function(value , key){ 
    return File_Upload.uploadFileToUrl(value, uploadUrl) 
    .success(function(result){ 
     vm.images_selected_uploaded.push(result); 
     console.log('here') 
    }); 
}) 
$q.all(promises).then(function() { 
    console.log('there') 
    console.log(vm.images_selected_uploaded) 
}) 

Из приведенного выше кода (скажем, длина значение 2, то выход будет

there 
here 
here 

То, что я действительно хотел здесь здесь. Что я здесь отсутствует?

+0

вы должны двигаться '' success' к затем' в '$ q.all()'. – Arg0n

+2

'.forEach' должно быть' .map' (при условии, что угловое .forEach/angular.map аналогично функционально для array.prototype.forEach/array.prototype.map ... hmmm, no angular.map ... –

ответ

6

Первая проблема, angular.forEach возвращает ссылку на первый аргумент, так что они не будут обещанием вы ищете

Второй проблему, угловатый не имеет падения замены для .map

Если вы сохраните обещания в массиве обещает, что вы можете сделать это

var uploadUrl = "/api/upload"; 
$('#add_product').closeModal(); 
var promises = []; 
angular.forEach(vm.images_selected, function(value , key){ 
    promises.push(File_Upload.uploadFileToUrl(value, uploadUrl) 
     .success(function(result){ 
      vm.images_selected_uploaded.push(result); 
      console.log('here') 
     }) 
    ); 
}) 
$q.all(promises).then(function() { 
    console.log('there') 
    console.log(vm.images_selected_uploaded) 
}); 
2

Что-то вроде этого:

var uploadUrl = "/api/upload"; 
$('#add_product').closeModal(); 
var promises = []; 
angular.forEach(vm.images_selected, function(value , key){ 
    promises.push(File_Upload.uploadFileToUrl(value, uploadUrl)); 
}); 
$q.all(promises).then(function (results) { 
    for(var i = 0; i < results.length; i++){ 
     var result = results[i]; 
     vm.images_selected_uploaded.push(result); 
     console.log('here'); 
    } 
    console.log('there'); 
    console.log(vm.images_selected_uploaded); 
}) 

ИЛИ Возможно, л ike:

var uploadUrl = "/api/upload"; 
$('#add_product').closeModal(); 
var promises = []; 
angular.forEach(vm.images_selected, function(value , key){ 
    var promise = File_Upload.uploadFileToUrl(value, uploadUrl); 
    promise.success(function(result){ 
     vm.images_selected_uploaded.push(result); 
     console.log('here'); 
    }); 
    promises.push(promise); 
}) 
$q.all(promises).then(function() { 
    console.log('there'); 
    console.log(vm.images_selected_uploaded); 
}) 

Оба непроверены кстати.

+0

Я думаю Я понял это Спасибо Arc0n! Ваше решение работает как шарм! –

+0

Принят еще через 5 минут –

+0

Второй намного яснее :) –

Смежные вопросы