2015-04-20 3 views
0

Я пытаюсь сделать вызов функции 'submittoServer', которая находится внутри фабричной «pService», которая вызывает вызов $ http, а затем передает данные. Вызов «submittoserver» происходит внутри цикла for. Проблема здесь в том, что я не мог видеть, что фактический вызов выполняется до последнего цикла, который отправляет только последний элемент, но, как вы видите в приведенном ниже коде, я хочу обновить одну конкретную переменную после каждого вызова, может кто-то пожалуйста предложите, как я могу этого не сделать. Я не могу перезвонить здесь, поскольку у меня есть другой метод, который вызывает эту же заводскую функцию с разными входами.асинхронные вызовы внутри для цикла angularJs

for (var i = vr.lines.length - 1; i >= 0; i--) { 

        if (parseInt(vr.lines[i].id) === id && Boolean(vr.lines[i].IsVoided) != true) { 
         lineId = vr.lines[i].lineID; 

         pService.submitToServer(actionId, { "IData": id }, ineId) 
           linesRemoved = linesRemoved + 1; 

        } 

        if (linesRemoved === lineqty) 
        { 
         updateModel = true; 
        } 
       } 

ответ

0

Проблема в том, что ваше обслуживание - это обещание вернуть данные. Ваша функция будет продолжать цикл и работать до того, как обещание будет разрешено. Вам нужно реорганизовать свой цикл, чтобы принять это во внимание.

Либо добавьте .then(fn(){}), чтобы выполнить обещание решения. Соберите все измененные строки и отправьте их все сразу и (снова) обработайте разрешенные обещания с помощью .then(fn(){}). И, наконец, дал вам следующий набор логики кода, вы, вероятно, хотите сделать что-то больше похоже на $ q.all ждать на все обещания (ы), чтобы решить, прежде чем двигаться вперед (см Wait for all promises to resolve)

Пример

перед вашим для петли:

var self=this; 
self.linesRemoved = 0; // or init as needed. 

Внутри вашей петли.

pService.submitToServer(actionId,{data}).then(function(resp){ 
    self.linesRemoved++; // shortcut, this does +1 to itself. 
}); 

Почему у вас есть модель обновления? С Угловым ваши данные имеют двустороннюю привязку и должны просто реагировать на изменение.

Пример $ HTTP вызов с возвращением в службу, это само по себе обещание:

return $http.post(url, data, { cache: true }); 

Используйте это в контроллере, как

service.callHttp(data).success(function(resp){ 
     self.linesRemoved++; 
}).error(function(resp){}); 

Если вы должны ждать, это могло бы быть лучше удерживайте все и ждите, пока все не закончите.

var promises =[]; 
for(){ 
    promises.push(service.callHttp()); 
} 
$q.all(promises).then(function(){ 
    // do work if(self.linesRemoved==lineQty) 
    // update... You can't evaluate until they are all finished right? 
}); 
+0

Hi KnowHowSolutions - ТНХ для ответа, я уже попробовал это, и это не сработало, потому что я не возвращенное обещание от моего $ HTTP вызова, когда вызов $ НТТРА успеха я вызывая другой метод, который будет транслировать результат. –

+0

Почему? $ http - это обещание. Просто верни его. – KnowHowSolutions

+0

К сожалению, это тоже мне не помогло. Я даже попробовал $ q, который снова ведет себя аналогичным образом. –

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