Подтвердить что ты не робот

Как связать вызовы Angular $http.get()?

У меня есть контроллер, которому нужно получить два отдельных ресурса REST, которые будут заполнять два выпадающих меню. Я хотел бы избежать заполнения каждого из них до тех пор, пока не вернутся вызовы $http.get(), так что выпадающие списки будут заполнены одновременно, вместо того, чтобы просачиваться один за другим.

Можно ли связать вызовы $http.get() и изящно установить переменные $scope для обоих возвращенных массивов, без необходимости писать логику состояния для обоих сценариев, например. a возвращает до b, b возвращается до?

4b9b3361

Ответ 1

Возвращаемое значение вызова функции Angular $http является объектом Promise, используя $q (обещание/отложенная реализация, вдохновленная Kris Kowal Q).

Взгляните на документацию $q.all(promises):

Объединение нескольких promises в одно обещание, которое разрешается, когда все входные данные promises разрешены.

Параметры

  • promises - {Array.<Promise>} - массив promises.

Возвращает

{Promise} - возвращает одно обещание, которое будет разрешено с помощью массива значений, каждое значение, соответствующее обещанию в том же индексе в массиве promises. Если какой-либо из promises разрешен с отказом, это результирующее обещание будет разрешено с тем же отказом.

Вы можете использовать $q.all для "соединения" результатов ваших HTTP-вызовов с кодом, похожим на:

app.controller("AppCtrl", function ($scope, $http, $q) {

  $q.all([
    $http.get('/someUrl1'),
    $http.get('/someUrl2')
  ]).then(function(results) {
     /* your logic here */
  });
}

Ответ 2

Вы имеете в виду что-то вроде этого:

function someController( $scope, $http, $q ) {
    var first_meth = $http.get("first_url"),
        second_meth = $http.get("second_url");
    $q.all([first_meth, second_meth]).then(function(all_your_results_array) { 
        //here you'll get results for both the calls
    });
}

Ссылка: Angular JS Doc

Ответ 3

Здесь вы можете использовать библиотеку java-скриптов Async: https://github.com/caolan/async.

Используйте вызов серии. Он сделает 2 вызова, а затем вызовет один обратный вызов, когда оба выполнены.