2015-09-25 2 views
2

Я пытаюсь написать службу, которая выполняет несколько асинхронных запросов, я использую $ q, чтобы вернуть обещание, проблема в том, что я пишу какой-то повторяющийся код, я хочу удалить повторение ,Как я могу написать обещание в AngularJS

app.factory('MyService',function($q){ 
    var ser = { 
      getA:function(){     
       var d= $q.defer; //repetitive code 
       asyn1().then(function(){ 
        aync2().then(function(res){ 
         //Process data 
         doSomething(res) 
         d.resolve(); 
        }) 
       }); 
       return d.promise 
      } , 
      getB:function(){ 
       var d= $q.defer; 
       asyn3().then(function(){ 
        aync4().then(function(res){ 
         //Process data 
         doSomething(res) 
         d.resolve(); 
        }) 
       }); 
       return d.promise 
      }        
    } 

    return ser; 
}); 

В каждой функции, я повторял $q вещи, как я могу избежать повторений.

ответ

3

Используйте обещание цепочка:

getA: function() {     
    return asyn1().then(function(responseFromAsyn1) { 
     return aync2(responseFromAsyn1); 
    }).then(function(responseFromAsync2) { 
     return postProcess(responseFromAsync2); 
    }); 
} 

getA() теперь намного короче исходного код, а также более правильно: абонент будет на самом деле получить отклоненное обещание, если asyn1() или async2() терпит неудачу.

+0

Я хочу сделать некоторые предварительной обработки данных, после aync2, перед возвращением. Поэтому я думаю, что не могу игнорировать $ q –

+0

Да, вы можете, цепляя обещания. Я исправлю свой ответ. –

0

Идея обещаний - написать код, который не увеличивает отступ справа, а также имеет дело с именем «callback hell».

Этот код

  getA:function(){     
      var d= $q.defer; //repetitive code 
      asyn1().then(function(){ 
       aync2().then(function(){ 
        d.resolve(); 
       }) 
      }); 
      return d.promise 
     } 

можно переписать так, что

  getA:function(){ 
      return async1() 
       .then(async2) 
       .then(processTheResultOfAsync2); 
      } 

или, если вам нужно какой-то синхронной обработки результата от Async1

  getA:function(){ 
      return async1() 
       .then(function(result) { 
       ..... soome synchronous processing 
       return async2(processed); 
       }); 
      } 

или если вам нужна асинхронной processinc

 getA:function(){ 
      return async1() 
       .then(function(result) { 
       return processAsync(result) 
        .then(async2); 
       }); 
      } 

Обещания должны сделать вашу жизнь проще, и если этого не происходит, вы не используете их правильно!

https://github.com/kriskowal/q

+0

Я хочу сделать предварительную обработку данных после aync2 перед возвратом. Поэтому я не могу игнорировать $ q –

+0

return async1(), затем (async2). Then (procesAsync2Result); – vbuhlev

0

Демо на моей странице jsFiddle: https://jsfiddle.net/MikaViko/kprbneha/

``var module = angular.module('app', []); 
    module.controller('appController', ['$scope', '$q', function($scope, $q) { 

     var fibonacci = [1, 1, 2, 3, 5, 8, 13, 20]; 

     $scope.getItem = function(index) { 
     var promise = getItemPromise(index); 
     promise.then(
      function(item) { 
      $scope.item = item; 
      $scope.error = ""; 
      }, 
      function(error) { 
      $scope.error = error; 
      $scope.item = null; 
      } 
     ); 
     }; 

     function getItemPromise(index) { 
     var item = fibonacci[index]; 
     var deferred = $q.defer(); 

     if (item) 
      deferred.resolve(item); 
     else 
      deferred.reject("L'item n'existe pas ou l'index n'est pas valide."); 

     return deferred.promise; 
     } 

    }]); 
+1

Просьба пояснить код. Проверьте [ответ] для получения подробной информации о том, как обеспечить хороший ответ. –

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