2015-07-15 6 views
0

Мне нужно синхронно вызывать 3 $ http-запросы. Я имею в виду, что после получения ответа от 1-го запроса будет вызван второй запрос. Следующий третий будет вызван после получения ответа от 2-го.

пример:

$http.get('FIRSTURL', param1).success(function(response){ 
    $http.get('SECONDURL', param2).success(function(response){ 
     $http.get('THIRDURL', param3).success(function(response){ 
      //Need to do some stuff with response 
     }); 
    }) 
}); 

Может кто-нибудь пожалуйста, предложить лучший способ реализовать его с помощью AngularJ

+0

Почему? Что не так с этим методом, по вашему мнению? – HaukurHaf

+0

Вы не можете создавать синхронные запросы с угловыми JS, а синхронные запросы AJAX устарели в большинстве браузеров. Вы можете врожденно связать этот порядок, используя «then» в результате обещания. –

+0

Я думаю, что должно быть что-то похожее на jQuery Deferred Object. что делает код более простым и передовым. Еще один момент: я хочу выделить все $ http-запросы, создав отдельный метод для каждого запроса. – Alp

ответ

0

Хотя не уверен, как обращаться с ним в определенном коде AngularJS, но все же существует работа с использованием Javascript bind(). Попробуйте это.

myService.doSomething().then(myService.doSomething1.bind(myService)).then(myService.doSomething‌​2.bind(myService)); 
+0

Спасибо! Его работа прекрасна. – Alp

0

Это единственный способ сделать это в порядке. Если вы хотите, чтобы сделать его красивее, вы можете поместить каждый элемент в функцию, а затем цепь на then вызов:

function doSomething() { 
    return $http.get('FIRSTURL', param1); 
} 

function doSomething1() { 
    return $http.get('SECONDURL', param2); 
} 

function doSomething2() { 
    return $http.get('THIRDURL', param3); 
} 

А потом:

doSomething().then(doSomething1).then(doSomething2); 
+0

На самом деле мне нужно реализовать то же самое. Но здесь методы doSomething(), doSomething1() и т. Д. Являются частью Сервиса. Эти функции должны поддерживать контекст службы. Поэтому мне нужно применить контекст службы. Как это сделать? – Alp

+0

@Alp, если у вас есть ваш сервис, вы можете настроить его таким же образом. Например: 'myService.doSomething(). Then (myService.doSomething1) .then (myService.doSomething2)' – Tom

+0

Я посмотрю на это через секунду, но [здесь] (http://jsbin.com/godesedano/edit ? html, js, output) Я собрал демонстрацию jsBin. Я использую '$ timeout' вместо' $ http', но он просто возвращает обещание, так что это точно та же концепция. – Tom

0

Если вы хотите, чтобы заставить синхронность, то вы можете использовать «then» метод обещания, возвращенный из вашего вызова $ http, Обратите внимание, что это только синхронизирует порядок ваших вызовов, это не вызовет вызовы для блокировки остальной части вашего кода.

$http.get('https://foo1') 
.then(function(response) { 
    return $http.get('https://foo2'); 
}) 
.then(function(response) { 
    return $http.get('https://foo3'); 
}) 
.then(function(response) { 
    return $http.get('https://foo4'); 
}) 
.catch(function(response) { 
    console.error('error', response.status, response.data); 
}) 
.finally(function() { 
    console.log("finally"); 
}); 
0

Line «Em Up, как обычное обещание:

$http.get('http://fiddle.jshell.net', param1) 
    .success(function(response){ 
     return $http.get('http://fiddle.jshell.net', param2) 
    }) 
    .success(function(response){ 
     return $http.get('http://fiddle.jshell.net', param3); 
    }) 
    .success(function(response){ 
     console.log('done!'); 
     //Need to do some stuff with response 
    }); 

Вот пример работает: http://jsfiddle.net/301gt2sm/

0

Вместо вложенность обратных вызовов можно использовать функцию обещания приковать их, как так :

$http.get('FIRSTURL', param1) 
    .then(getSecond) 
    .then(getThird) 
    .then(function(response){ 
     //Need to do some stuff with response 
    }); 

функция getSecond (response) { return $ http.get ('SECONDURL', param2); }

function getThird (response) { return $ http.get ('THIRDURL', param3); }

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