2013-04-08 2 views
1

Я в настоящее время изучаю Javascript и AngularJS в определенной и есть одна вещь, которую я не могу понять, как это сделать. Как вы увидите дальше, я также пытаюсь переключить свое мнение с «последовательного» мышления.
Я хочу сделать два запроса $http.post(), и когда они оба выполнены успешно, выполните функцию. Мне удалось сделать его работу по вложенности запросов так:Когда оба выполняемых http-запроса выполняют функцию

$http.post(url, {something}).success(function (response) { 
    $http.post(url, {something}).success(function (secondResponse) { 
     myFunction(); 
    }); 
}); 

Это работает, но это вложенное, не асинхронные и вообще хромает. Интересно, если это возможно, чтобы сделать эти запросы, как, что (я знаю, что следующий код не будет работать должным образом):

$http.post(url, {something}).success(function (response) { someKindOfFlag = true });  
$http.post(url, {something}).success(function (response) { anotherKindOfFlag = true }); 
if (someKindOfFlag && anotherKindOfFlag) { myFunction(); } 

ответ

1

Вы бы слышали о $ д или обещаний в Javascript в целом и, в частности, Угловое. Чтобы достичь того, что вы хотите сделать, вам нужно использовать API $ q.

Вот как вы это делаете. Вам нужно будет ввести $ q в вашу службу или ваш контроллер (но я бы посоветовал, чтобы это стало возможным, если это возможно!).

var firstResponse = $http.post(url, {something}); 

var secondResponse = $http.post(url, {something}); 

$q.all([firstResponse,secondResponse]).then(function(data){ 
     //data[0] === firstResponseData 
     //data[1] === secondResponseData 
     myFunction(); 
}); 
+0

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

+0

@the_lay приветствуем вас. В то время, когда я получил «обещания», я был поражен. Надеюсь, это тоже самое для вас :). – ganaraj

2

Правильное решение в данном случае является реле на обещание API и использовать AngularJS $q service - его метод $q.all(), чтобы быть более точным.

Служба $ http уже работает с обещаниями в том смысле, что она возвращает обещание от вызовов функций $ http.

Чтобы иметь обратный вызов выполняется, когда оба $http запросов завершили вы могли бы использовать метод $q.all() следующим образом:

$q.all([$http.post(url, {something}), $http.post(url, {something})]).then(function(arrayOfResponses) { 
    // success callback code goes here 
}); 
+0

Я еще не могу выдвинуть, так что все, что я могу сделать, это просто сказать спасибо! :) –

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