2014-11-05 16 views
18

में सिंक्रोनस http अनुरोध कैसे करें AngularJS में http अनुरोध अवरुद्ध करने के लिए कैसे करें ताकि मैं अगली पंक्ति पर $ http प्रतिक्रिया का उपयोग कर सकूं?कोणीय जेएस

निम्न उदाहरण में, $http वस्तु क्योंकि $scope.data रिटर्न खाली मूल्य अगली पंक्ति में परिणाम वापस नहीं करता है, ताकि मैं fullcalender(), एक JavaScript लाइब्रेरी को यह परिणाम पारित कर सकते हैं,।

$http.get('URL').success(function(data){ 
    $scope.data = data; 
}); 

$.fullCalender({ 
    data: $scope.data 
}); 
+0

क्या इससे बचने का कोई तरीका है? जावास्क्रिप्ट एकल थ्रेडेड है, और एक सिंक्रोनस HTTP अनुरोध करने से पूरे ब्रॉसर को अवरुद्ध कर दिया जाएगा, जबकि यह प्रतिक्रिया के लिए इंतजार कर रहा है। यह आपका पसंदीदा समाधान नहीं होना चाहिए। – GregL

+1

क्या आप सफलता कॉलबैक में कॉल को पूर्ण कैलेंडर में नहीं ले जा सकते हैं और कॉलबैक के डेटा तर्क के बराबर डेटा सेट कर सकते हैं? – Scott

+0

जब मैं कॉलबैक में पूर्ण कैलेंडर डेटा का उपयोग करता हूं तो यह टेम्पलेट पर प्रदर्शित नहीं होता है। – Dipak

उत्तर

2

आप इसके लिए promises का उपयोग कर सकते हैं।

$scope.myXhr = function(){ 

    var deferred = $q.defer(); 

    $http({ 
     url: 'ajax.php', 
     method: 'POST', 
     data:postData, 
     headers: {'Content-Type': 'application/x-www-form-urlencoded'} 
     }) 
     //if request is successful 
     .success(function(data,status,headers,config){ 

      //resolve the promise 
      deferred.resolve('request successful'); 

     }) 
     //if request is not successful 
     .error(function(data,status,headers,config){ 
      //reject the promise 
      deferred.reject('ERROR'); 
     }); 

    //return the promise 
    return deferred.promise; 
} 

$scope.callXhrAsynchronous = function(){ 

    var myPromise = $scope.myXhr(); 

    // wait until the promise return resolve or eject 
    //"then" has 2 functions (resolveFunction, rejectFunction) 
    myPromise.then(function(resolve){ 
     alert(resolve); 
     }, function(reject){ 
     alert(reject)  
    }); 

} 
+1

के बाद '$ http' द्वारा बनाए गए वादे को वापस न करने का क्या कारण है? मौजूदा मानों को स्थगित करने के लिए यह एक बुरा अभ्यास है –

+0

क्योंकि '$ http' द्वारा बनाए गए वादे एसिंक – stevemao

+63

है, मुझे आश्चर्य है कि इसे उत्तर के रूप में क्यों स्वीकार किया गया है। ओपी ने ** सिंक्रोनस ** के बारे में पूछा, और आपने ** एसिंक्रोनस ** – KingJulian

2

आप नहीं, तो आप सौदा इसके साथ वादों के माध्यम से की आवश्यकता होगी सकता है, लेकिन आप इस तरह से यह करने की कोशिश कर सकते:

$http.get('URL').success(function(data){ 
    angular.copy(data, $scope.data); 
}); 

$.fullCalender({ 
    data: $scope.data 
}); 

लेकिन सबसे

यह नमूना कोड है लोगों को अभी

$http.get('URL').success(function(data){ 
    $.fullCalender({ 
     data: data 
    }); 
}); 

अपने fullCalender वस्तु async डेटा के साथ काम नहीं करता है, तो जो कुछ भी है, आप इसे रैप करने के लिए आवश्यकता हो सकती है क्या करना होगा एनजी-जैसे कुछ में या डेटा को आपूर्ति किए जाने पर इसे फिर से निकालने के लिए मजबूर करें। रूट नियंत्रक का उपयोग करके डेटा लोड होने तक आप नियंत्रक को तब तक लोड नहीं कर सकते हैं।

1

यहाँ एक व्यावहारिक जवाब, उपयोगकर्ता Kirill Slatin के सौजन्य से जो एक टिप्पणी के रूप में उत्तर पोस्ट है:

यहाँ एक उदाहरण है। उत्तर के नीचे व्यावहारिक उपयोग उदाहरण।

, तो मेरे जैसे, आप एक गुंजाइश चर के रूप में है कि प्रतिक्रिया ऑब्जेक्ट का उपयोग करने की जरूरत है, यह काम करना चाहिए:

$http.get('URL').success(function(data){ 

$scope.data = data; 
$.fullCalender = $scope.data; 
$scope.$apply() 
}); 

$scope.$apply() क्या प्रतिक्रिया ऑब्जेक्ट बना रहेगा ताकि आप उस डेटा का उपयोग कर सकते है।

-

क्यों आप ऐसा करने की आवश्यकता होगी?

मैं अपने व्यंजनों ऐप के लिए "संपादन" पृष्ठ बनाने की कोशिश कर रहा था। मुझे चयनित फॉर्म के डेटा के साथ अपना फॉर्म पॉप्युलेट करने की आवश्यकता थी। मेरा जीईटी अनुरोध करने के बाद, और $ scope.form पर प्रतिक्रिया डेटा पास करने के बाद, मुझे कुछ भी नहीं मिला ... $scope.$apply() और Kirill Slatin ने बड़ी समय में मदद की। चीयर्स दोस्त!

यहाँ मेरी editRecipeController से उदाहरण है:

$http.get('api/recipe/' + currentRecipeId).then(
    function (data) { 
     $scope.recipe = data.data; 
     $scope.form = $scope.recipe; 
     $scope.$apply() 
    } 
); 

आशा में मदद करता है!