5

Я работаю над angularJS-приложением, и это мой первый веб-сайт с использованием этой структуры. В моем приложении мне нужно сделать вызов $ http внутри цикла for. Когда в цикле перед следующей итерацией я хочу дождаться ответа от моего предыдущего вызова. Каков наилучший и простой способ сделать это. Я пробовал использовать callBack, $ q.all(), тогда во всех этих случаях проходит только последний запрос. Пожалуйста помоги.

Примечание. Мой API, с которым я звоню через $ http, не может отправлять запросы в очередь.

Редактировать: Я пробовал оба подхода ниже, и в обоих случаях только последний запрос выполняется успешно. Можете ли вы рассказать мне, что не так, я здесь.

Подход 1:

var promiseArray=[]; 

for(var i=0;i<items.length;i++) 
{ 
var promise=services.Post(items[i]); 
promiseArray.push(promise); 
} 

$q.all(promiseArray).then(data) 
{ 
... 
} 

Подход 2:

var promises = []; 

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

    var deffered = $q.defer(); 
    var promise = services.Post(items[i]); 
    promise.success(function(data) { 
     deffered.resolve(data); 
    }) 
    promises.push(deffered); 
} 

результат переменная = $ q.all (обещает);

EDIT: 2 Service Code:

Services.Post = function(lineItemId, submitUrl) { 
    var url = (submitUrl) ? submitUrl : Services.serviceUrl; 

    return $http.post(url, { 
     "LineItemID": lineItemId 
    }). 
    success(function(data, status, headers, config) { 
     Services.processResponse(data, status, headers, config); 
    }). 
    error(function(data, status, headers, config) { 

     JL('Angular').error('Error response when calling Service ' + config); 

    }); 
}; 
+0

взглянуть на асинхронном Lib (https://github.com/caolan/async) вы можете загрузить его в браузере через browserify/WebPack/JSPM –

ответ

5

Вы можете использовать $q.when который бы обещание $http &, когда он получает решить, что вызов функции внутри .then

$q.when(promiseObj).then(callback); 

Если являются многообещающими, тогда вы можете использовать $q.all, которые будут принимать массив обещаний & называется функцией тогда, когда все обещания внутри функции будут решены.

$q.all([promiseObj1, promiseObj2]).then(callback); 

Update

Я думаю, ваш первый подход является правильным пропустил только пару вещи

  1. for условие цикла, который делает создать дополнительный объект, который будет неопределенными
  2. $q.all должны есть функция внутри .then

Код

var promiseArray=[]; 

for(var i=0; i < items.length - 1;i++) //<-- change from i<items.length 
{ 
var promise=services.Post(items[i]); 
promiseArray.push(promise); 
} 

$q.all(promiseArray).then(function(data) //<-- it should be function in .then 
{ 
    //this will called after all promises get resolved. 
}); 
+0

Привет Pankaj, спасибо за ответ, я пробовал разные подходы, о которых я упомянул выше. Пожалуйста, взгляните на него и исправьте меня, если что-то не так. –

+0

@ AjaySrikanth ваш первый подход выглядит круто .. Я думаю, что в угловом сервисе вы не вернули обещание, вам придется возвратить обещание от службы. Если у вас есть какие-то сомнения, то ... у вас тоже угловой код обслуживания.Я тоже помогу с этим кодом –

+0

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

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