Дождитесь обещания $http перед следующим запросом

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

Примечание. Мой 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);
}

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

EDIT :2 Код услуги:

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

    });
};

person Ajay Srikanth    schedule 23.04.2015    source источник
comment
взгляните на асинхронную библиотеку (github.com/caolan/async), вы можете загрузить ее на браузер через browserify/webpack/jspm   -  person Felipe Skinner    schedule 23.04.2015


Ответы (1)


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

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

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

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

Обновить

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

  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.
});
person Pankaj Parkar    schedule 23.04.2015
comment
Привет, Панкай, спасибо за ответ, я пробовал разные подходы, о которых упоминал выше. Пожалуйста, взгляните на него и поправьте меня, если что-то не так. - person Ajay Srikanth; 23.04.2015
comment
@AjaySrikanth, ваш первый подход выглядит круто.. Я думаю, что в службе angular вы не вернули обещание, вам нужно вернуть обещание из службы.. если у вас есть какие-либо сомнения, тогда .. добавьте код службы angular. тоже помогу с этим кодом - person Pankaj Parkar; 23.04.2015
comment
Спасибо, что расширили вашу помощь, я скопировал свой сервисный код здесь, не могли бы вы взглянуть на него - person Ajay Srikanth; 24.04.2015
comment
@AjaySrikanth тебе помогло? - person Pankaj Parkar; 05.05.2015
comment
На самом деле это мне не помогло, так как служба, которую я вызываю, не может ставить запросы в очередь и может обрабатывать запросы один за другим. - person Ajay Srikanth; 08.05.2015
comment
@AjaySrikanth, вы хотите сохранить очередь синхронизации? - person Pankaj Parkar; 08.05.2015
comment
да, поскольку моя служба не может обрабатывать очередь, я хочу, чтобы мой код перестал двигаться дальше, пока не завершится последняя итерация моего цикла for, прежде чем он выполнит что-либо еще после цикла for. - person Ajay Srikanth; 12.05.2015
comment
о.. но в настоящее время ваш код ищет код запуска после того, как вся куча обещаний усложняется.. - person Pankaj Parkar; 12.05.2015