2013-09-05 15 views
22

लोग,

मैं अपने कोड सेटअप प्रक्रिया कुछ के रूप में नीचे है:

$scope.init = function(){ 
    return $q.all([resource1.query(),resource2.query(),resource3.query()]) 
      .then(result){ 
       $scope.data1 = result[1]; 
       $scope.data2 = result1[2]; 
       $scope.data3 = result[3]; 


       console.log(data1); //prints as [$resolved: false, $then: function] 

       doSomething($scope.data1,$scope.data2); 
       } 
} 

मैं यह धारणा थी कि "फिर" फ़ंक्शन कॉल किया जाएगा केवल जब सभी संसाधनों हल हो जाओ। हालांकि यह वह नहीं है जो मैं अपने कोड में देख रहा हूं। अगर मैं डेटा 1 प्रिंट करता हूं, तो मुझे अनसुलझा मिलता है।

किसी भी सुराग के रूप में जो मैं यहां याद कर रहा हूं ??

+0

'resource1.query()', आदि वापसी करता है एक वादा? ['all'] (http://docs.angularjs.org/api/ng.$q#all) वादे के एक ऐरे की अपेक्षा करता है, और यदि वे वादा नहीं कर रहे हैं तो उन्हें तुरंत पूरा माना जाएगा। –

+0

मैं कोणीय 1.15 का उपयोग कर रहा हूं और यह इस तरह कुछ देता है [$ हल किया गया: झूठा, $ फिर: फ़ंक्शन] मुझे विश्वास है कि यह एक वादा है – runtimeZero

+0

कृपया ध्यान दें कि परिणाम सरणी में सूचकांक शून्य-आधारित हैं, जैसा कि अपेक्षा की जाएगी सरणी, तो $ scope.data1 = परिणाम [0], आदि –

उत्तर

57

मैं इस समस्या का सामना किया है, और यह काफी भ्रमित था मैं इसे का प्रयोग करेंगे। समस्या यह प्रतीत होती है कि संसाधन कार्रवाई को कॉल करना वास्तव में एक http वादा नहीं करता है, लेकिन एक खाली संदर्भ (जो सर्वर से डेटा लौटाता है, तब पॉप्युलेट होता है-the $resource docs का रिटर्न मान अनुभाग देखें)।

मुझे यकीन नहीं है कि इसका परिणाम क्यों होता है। फिर (परिणाम) अनसुलझे वादे की एक सरणी लौट रहा है, लेकिन प्रत्येक संसाधन के वादे को पाने के लिए, आपको resource1.query().$promise का उपयोग करने की आवश्यकता है। अपना उदाहरण दोबारा लिखने के लिए:

$scope.init = function() { 
    return $q.all([resource1.query().$promise, resource2.query().$promise, resource3.query().$promise]) 
      .then(function(result) { 
      $scope.data1 = result[0]; 
      $scope.data2 = result[1]; 
      $scope.data3 = result[2]; 

      console.log($scope.data1); 

      doSomething($scope.data1,$scope.data2); 
      }) 
} 

मुझे आशा है कि किसी और को कुछ समय बचाएगा।

+3

यह वास्तव में भ्रमित है और सबसे अच्छा मैं कहीं भी दस्तावेज नहीं कह सकता हूं। संसाधन कॉल के बाद '' 'वादा''' के बिना मुझे एक अपूर्ण वादा मिल रहा था। तब कोई समझ नहीं आता है। इसके लिए धन्यवाद। – blu

+0

इसे इस प्रश्न के उत्तर के रूप में चिह्नित किया जाना चाहिए। –

+0

धन्यवाद दस लाख !! – mgalic

0

आप प्रिंट कर रहे हैं data1 नहीं $ scope.data1

console.log(data1); 

अगर मैं तुम थे के रूप में इस प्रकार है

$scope.init = function(){ 
return $q.all([resource1.query(),resource2.query(),resource3.query()]) 
     .then(result){ 
      console.log(result[1]); 
      $scope.data1 = result[1]; 
      $scope.data2 = result1[2]; 
      $scope.data3 = result[3]; 

      doSomething($scope.data1,$scope.data2); 
      } 
} 
+0

@ जेम्स हंस, क्या इससे आपकी समस्या ठीक हुई? –

0

@cdidyks की तरह यह उत्तर $promise का उपयोग करता है, लेकिन मेरी राय में यह एक बेहतर डिजाइन पैटर्न है क्योंकि यह असाइनमेंट के लिए पूरा होने वाले सभी संसाधनों पर भरोसा नहीं करता है, और कम कोड में $ वादे अधिक सुलभ बनाता है।

$scope.data1 = resource1.query(); 
$scope.data2 = resource2.query(); 
$scope.data3 = resource3.query(); 

$scope.init = function() { 
    return $q.all([ 
     $scope.data1.$promise, 
     $scope.data2.$promise, 
     $scope.data3.$promise 
    ]) 
    .then(function(result) { 
     console.log('all done'); 
     doSomething($scope.data1, $scope.data2); 
    }) 
} 
0

अभी भी इस बारे में जाने के लिए एक बेहतर तरीका पता लगाने की कोशिश करने वालों के लिए, इस प्रयास करें:

resource.query().$promise.then(function(result) { 
    console.log(result); 
    // Do something else, like instantiate a JS driven table 
    }); 
संबंधित मुद्दे