2013-04-17 6 views
32

मैं एकाधिक स्थगित फ़ंक्शन कॉल को एक साथ श्रृंखलाबद्ध करने की कोशिश कर रहा हूं जैसे कि अगली कॉल पिछले deferred.resolve के परिणाम प्राप्त करती है। जब मैं इनमें से 2 से अधिक कॉलों को एक साथ जोड़ता हूं, तो डेटा वापस लौटा रहता है।AngularJS में q का उपयोग करके एकाधिक जंजीर स्थगित फ़ंक्शन डेटा लौटने से रोकते हैं

$scope.runAsync = function() { 
     var asyncFn1 = function(data){ 
      var deferred = $q.defer(); 

      $timeout(function(){ 
       console.log("Async fn1 " + data); 
       $scope.outputLines.push("Async fn1 " + data); 
       deferred.resolve("Async fn1 " + data); 
      },1000); 

      return deferred.promise; 
     } 

     var asyncFn2 = function(data){ 
      var deferred = $q.defer(); 

      $timeout(function(){ 
       console.log("Async fn2 " + data); 
       $scope.outputLines.push("Async fn2 " + data); 
       deferred.resolve("Async fn2 " + data); 
      },1000); 

      return deferred.promise; 
     } 

     asyncFn1(1) 
     .then(function(data){asyncFn2(data)}) 
     .then(function(data){asyncFn2(data)}) 
     .then(function(data){asyncFn2(data)}); 
    } 

जब मैं इस चलाने मैं मिल निम्नलिखित उत्पादन:

Async fn1 1 
Async fn2 Async fn1 1 
Async fn2 undefined 
Async fn2 undefined 

मैं कैसे उन्हें एक साथ श्रृंखला कर सकते हैं ताकि तीसरे कॉल हो जाता है

यहाँ एक कोणीय नियंत्रक के अंदर बुनियादी कोड है दूसरे कॉल और चौथे के नतीजे तीसरे से परिणाम प्राप्त करते हैं?

मैं एक jsFiddle बनाया है: http://jsfiddle.net/rhDyL/

उत्तर

40

अंश $ q पर आधिकारिक दस्तावेज़ से लिया:

तो (successCallback, errorCallback) - की परवाह किए बिना जब वादा था या का समाधान हो जाएगा या अस्वीकार कॉल सफलता या त्रुटि कॉलबैक असीमित रूप से परिणाम के रूप में जल्द ही उपलब्ध है। कॉलबैक को एक तर्क के साथ बुलाया जाता है परिणाम 0 अस्वीकरण या अस्वीकार कारण।

यह विधि एक नया वादा देता है जो के माध्यम से हल या अस्वीकार कर दिया गया है सफलता की वापसी मूल्य या त्रुटि कॉलबैक।

और successCallack या errorCallback की वापसी मूल्य के लिए, Domenic's slides के अनुसार:

अगर वापसी मान एक वादा है तो वादा गोद ले लौटे वादा राज्य अन्यथा सफलता कॉलबैक तुरंत है वापसी मान

परिभाषा के आधार पर साथ कहा जाता है, अपने कोड return कीवर्ड याद आ रही है। यह निम्नानुसार होना चाहिए:

asyncFn1(1) 
    .then(function(data){return asyncFn2(data)}) 
    .then(function(data){return asyncFn2(data)}) 
    .then(function(data){return asyncFn2(data)}); 
+0

वाह .. धन्यवाद। मैं इसे अब देखता हूं। मैं इस तथ्य से उलझन में हूं कि .then() विधि एक नया वादा देता है, लेकिन asyncFn के अंदर मैं स्थगित वस्तु से एक वादा वापस कर रहा हूं। ऐसा लगता है कि वादे की संख्या दोगुना है। – BoxerBucks

+2

मैं उसी स्थिति में था जो बहुत पहले नहीं था। _Promise और deferred_ को सीखने के लिए कुछ सीखने की वक्र और अभ्यास की आवश्यकता होती है। फिर भी, मुझे लगता है कि यह इसके लायक है। यह एसिंक प्रोग्रामिंग की दुनिया में कोड निष्पादन को और अधिक आसान बनाता है। यदि आप अभी भी इस विषय से परिचित नहीं हैं, तो मैं अत्यधिक अनुशंसा करता हूं [यह पढ़ना] (http://www.slideshare.net/domenicdenicola/promises-promises)। – tamakisquare

+1

@tamakisquare - प्रतिक्रिया और टिप्पणी के लिए धन्यवाद। मुझे लगता है कि भ्रम का मुख्य बिंदु [डोमेनिक की प्रेजेंटेशन] की स्लाइड # 7 में स्पष्ट किया गया है (http://www.slideshare.net/domenicdenicola/promises-promises) यह है कि यदि वापसी मूल्य एक वादा है तो वादा स्वीकार करता है वादे के राज्य को वापस कर दिया अन्यथा सफलता कॉलबैक तुरंत वापसी मूल्य के साथ बुलाया जाता है। शायद आप इसे भी प्रतिबिंबित करने के लिए अपने उत्तर को संशोधित कर सकते हैं - अधिक पूर्ण होने के लिए। धन्यवाद। – Amir

संबंधित मुद्दे