Работать с двумя асинхронными вызовами в angualrjs?

В настоящее время я новичок в концепции обещаний angularjs и обнаруживаю, что застрял в асинхронной пирамиде.

Ситуация представляет собой асинхронную функцию, которая в случае успеха вызывает другую асинхронную функцию 2. Желаемый результат - выполнить некоторые операции после полного выполнения обеих функций.

// Inside Controller    
         ServiceName.AsyncFunc1().then(function(){
               alert("Complete");     
         })


// Inside Service    
            app.service('ServiceName', function ($http) {
            return {
                AsyncFunc1 : function()
                {
                       var self = this;
                       return $http.post(url).
                       success(data)
                       {
                            self.AsyncFunc2();
                       }
                },
                AsyncFunc2 : function()
                {
                       return $http.post(url2).
                       success(data)
                       {
                            alert("AsyncFunc2 Complete");
                       }
                },
          }
    });

Теперь я хочу, чтобы alert("Complete") вызывался, когда оба последовательных асинхронных вызова завершены. Но в настоящее время у меня есть предупреждение («Завершено») перед предупреждением («AsyncFunc2 Complete»);


person Rahul    schedule 03.09.2015    source источник
comment
return self.AsyncFunc2();, также измените success на then.   -  person Mikko Viitala    schedule 03.09.2015


Ответы (1)


Если вам нужны предупреждающие сообщения, когда обе функции возвращают обещание, вы можете использовать $q.all

$q.all требуется массив обещаний.

Пример

 $q.all([function1(), function2()])

ИЗМЕНИТЬ Хорошо! В этом случае вы можете просто использовать then после разрешения второй последовательной функции. Из вашего объяснения я так понимаю.

(function(){
  angular
    .module('myApp')
    .controller('MyController', MyController);


  function MyController(myService) {

    function secondASyncSuccess() {
      alert("second function is done");
    }

    function firstFuncSuccess() {
     alert("First func is done");
      myService.secondASyncFunction()
        .then(secondASyncSuccess, secondASyncFailure);
    }

    myService.firstASyncFunction()
      .then(firstFuncSuccess, firstFuncFailure);
  }

})();
person InfinitePrime    schedule 03.09.2015
comment
$q.all() работает параллельно, но я хочу, чтобы он был последовательным. - person Rahul; 03.09.2015
comment
Попробуй это. Я надеюсь, что это то, что вы подразумеваете под последовательным выполнением вызовов $http через промисы. - person InfinitePrime; 03.09.2015