AngularJS + $q, сделайте что-нибудь после завершения нескольких вызовов ajax

Мне нужно загрузить некоторые данные при загрузке страницы, а затем выполнить задачу. чтобы получить данные, которые я хочу, я выполняю несколько разных вызовов ajax. Но для выполнения задачи мне нужно убедиться, что все вызовы ajax завершены. Вот что я сделал до сих пор:

$q.when(
        $http.get('url1').success(function (data) {
            $scope.data1 = data;
            console.log("ajax1 finished");
        }),
        $http.get('url2').success(function (data) {
            $scope.data2 = data;
            console.log("ajax2 finished");
        }),
        $http.get('url3').success(function (data) {
            $scope.data3 = data;
            console.log("ajax3 finished");
        }),
        $http.get('url4').success(function (data) {
            $scope.data4 = data;
            console.log("ajax4 finished");
        })
    ).then(
        console.log("All ajax calls have finished!"),
        executeTask()
    );

Моя проблема в том, что код в блоке then(...); не выполняется после того, как завершился вызов ajax. Я получаю что-то вроде этого в моей консоли:

ajax2 finished
ajax1 finished
All ajax calls have finished!
ajax3 finished
ajax4 finished

Должно быть, я делаю что-то не так. Как я могу заставить его работать так, как я хочу?


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

$q.all([
    $http.get('url1').then(function (data) {
        $scope.data1 = data;
        console.log("");
    }),
    $http.get('url2').success(function (data) {
        $scope.data2 = then;
        console.log("ajax2 finished");
    }),
    $http.get('url3').then(function (data) {
        $scope.data3 = data;
        console.log("ajax3 finished");
    }),
    $http.get('url4').then(function (data) {
        $scope.data4 = data;
        console.log("ajax4 finished");
    })
]).then(
    console.log(""),
    executeTask()
);

person Christos Baziotis    schedule 31.07.2014    source источник
comment
Я считаю, что $q.all должен принять множество обещаний   -  person maurycy    schedule 31.07.2014
comment
@maurycy тоже пробовал это, и это не работает.   -  person Christos Baziotis    schedule 31.07.2014
comment
У вас все еще есть успешный вызов в отредактированном сообщении.   -  person pixelbits    schedule 31.07.2014


Ответы (2)


Я сделал для вас рабочий плунжер с использованием $q.all()

http://plnkr.co/edit/JHd3XPTKBxx4KRso5JRB?p=preview

  $q.all([
    $http.jsonp('http://ip.jsontest.com/?callback=JSON_CALLBACK').then(function(response) {
      $scope.ip.one = response.data
      console.log('one')
    }),
    $http.jsonp('http://ip.jsontest.com/?callback=JSON_CALLBACK').then(function(response) {
      $scope.ip.two = response.data
      console.log('two')
    }),
    $http.jsonp('http://ip.jsontest.com/?callback=JSON_CALLBACK').then(function(response) {
      $scope.ip.three = response.data
      console.log('three')
    }),
    $http.jsonp('http://ip.jsontest.com/?callback=JSON_CALLBACK').then(function(response) {
      $scope.ip.four = response.data
      console.log('four')
    }),
  ]).then(function() {
    console.log('all')
  })
person maurycy    schedule 31.07.2014
comment
Спасибо. Ошибка была в том, что я делал .then(myTask()) вместо .then(function() { myTask() }). Это было прямо перед моими глазами, но я пропустил это. - person Christos Baziotis; 31.07.2014
comment
Также помните, что promise для $http возвращает объект ответа, который содержит несколько значений, и одно из них data, которое вы, вероятно, не хотите использовать. - person maurycy; 31.07.2014

У вас есть два решения:

person Jscti    schedule 31.07.2014
comment
проверьте мое редактирование. Я пытался использовать $q.all, но он все еще не работает так, как я хочу. - person Christos Baziotis; 31.07.2014