2013-08-02 7 views
8

कोड पर विचार करें:

var myApp = angular.module('myApp', []); 

मार्गों:

myApp.config(['$routeProvider', function($routeProvider) { 
     $routeProvider.when('/', { 
      templateUrl: 'app.html', 
      controller:myAppController, 
      resolve:{ 
       resolveData:function(Resolver){ 
        return Resolver(); 
       } 
      } 
     }); 
    }); 

हल:

myApp.factory('Resolver', ['$http', function($http){ 
    return function(){ 
     return $http({url: '/someurl',method: "GET"}).then(function(data) { 

      // dependent call 1 
      $http({url: '/someotherurl',method: "GET" }).then(function(data) { 

      }); 

      // dependent call 2 
      $http({url: '/someanotherurl',method: "GET" }).then(function(data) { 

      }); 
     }); 
    } 
}]); 

से ऊपर मैं के रूप में एक के अंदर 2 कॉल नेस्ट है वे अभिभावक कॉल द्वारा लौटाए गए डेटा पर निर्भर हैं।

मैं क्या करना चाहता हूं: रिजॉल्वर वापस लौटाएं जब उनमें से सभी ने पूरा किया हो और केवल माता-पिता कॉल न करें।

मैं $ q.all() का उपयोग नहीं कर सकता क्योंकि कॉल के 2 कॉल पहले कॉल के आश्रित हैं।

संक्षेप में, मेरे 3 कंट्रोलर को केवल 3 कॉल पूरा होने के बाद ही लोड किया जाना चाहिए।

उत्तर

9

आप अपनी समस्या को हल करने के लिए .just नीचे नमूना कोड का उपयोग वादा और $ q सेवा चेनिंग का उपयोग करना चाहिए यह काम करना चाहिए

myApp.factory('Resolver', ['$http','$q', function ($http,$q) { 
       return function() { 
        var deferred = $q.defer(); 

        $http({ url: '/someurl', method: "GET" }).then(function (data) { 
         return $http({ url: '/someurl', method: "GET" }) 
        }).then(function (data) { 
         return $http({ url: '/someanotherurl', method: "GET" }) 
        }).then(function (data) { 
         deferred.resolve(data); 
        }); 
        return deferred.promise; 

       } 
      }]); 
+0

हाय अजय! तत्काल उत्तर के लिए धन्यवाद। लेकिन क्या आपको लगता है कि अगर मैं चेनिंग का उपयोग करता हूं तो मैं अगली कॉल में पहले कॉल द्वारा लौटाए गए डेटा को पास कर पाऊंगा? – AlwaysALearner

+0

हाँ प्रत्येक फ़ंक्शन के अंदर डेटा पिछले –

+0

से लौटा गया डेटा है मेरी चेन मेरी ज़रूरत को पूरा नहीं करता है। मैं नेस्टेड कॉल के लिए गया था। लेकिन $ q ने वास्तव में मुझे चीज़ को ठीक करने में मदद की। धन्यवाद। वोट दिया! :) – AlwaysALearner

0

यह मेरे लिए काम करता है:

  resolve : { 
       message: function($q, $route, Restangular) { 

        var msgId = $route.current.params.msgId; 
        var deferred = $q.defer(); 

        Restangular.one('message', msgId).get().then(function(message) { 
         Restangular.one('file', message.audioFile.id).get().then(function (blob) { 
          message.blob = blob; 
          deferred.resolve(message); 
         }); 
        }); 
        return deferred.promise; 
       } 
      } 
संबंधित मुद्दे