कैसे की जाँच करें कि क्या एक कोणीय $ q वादा हल किया गया है


84

मैं समझता हूं कि आम तौर पर then()वादों का उपयोग करते समय एक कॉल और चेन व्यवहार के साथ एक निरंतरता कोड संलग्न किया जाएगा ।

हालांकि, मैं एक वादा-लिपटे अतुल्यकालिक कॉल को किक करना चाहता हूं और फिर 3-सेकंड को अलग से किक करता $timeout()हूं ताकि मैं एक यूआई कार्रवाई कर सकूं, केवल मूल वादा अभी तक पूरा नहीं हुआ है। (मुझे आशा है कि यह केवल धीमे कनेक्शन, 3 जी पर मोबाइल उपकरणों आदि पर होगा)

किसी वादे को देखते हुए, क्या मैं जांच कर सकता हूं कि यह पूरी तरह से अवरुद्ध या प्रतीक्षा किए बिना है?


2
मैंने कोणीय में इस पर एक मुद्दा खोला और एक उपयोगी प्रतिक्रिया मिली github.com/angular/angular.js/issues/8307#issuecomment-49903373
derekdreery

जवाबों:


46

मुझे लगता है कि यह कोणीय के हाल के संस्करण में जोड़ा गया था, लेकिन लगता है कि अब वादा पर एक $ $ राज्य वस्तु होगी:

 var deferred = $q.defer();
 console.log(deferred.promise.$$state.status); // 0
 deferred.resolve();
 console.log(deferred.promise.$$state.status); //1 

जैसा कि टिप्पणियों में उल्लेख किया गया है, यह अनुशंसित नहीं है क्योंकि यह आपके कोणीय संस्करण को अपग्रेड करते समय टूट सकता है।


25
कोणीय डॉक्स का कहना है कि $$...गुणों का उपयोग नहीं किया जाना चाहिए। कोणीय के नए संस्करणों में अपग्रेड करते समय जोखिम भरा हो सकता है ...
hgoebl

7
बहुत बुरा एंगुलर एक चांदी की थाली पर अपने निजी चर प्रदान करता है। :(
जैक्सन


2
लेकिन लेकिन ... कोणीय ने inspectकार्य को लागू नहीं किया । तो हमारे लिए कोई रस नहीं। वादा प्रोटोटाइप बस यह नहीं है।
रॉबर्ट कोरिटनिक

36

मुझे लगता है कि आपका सबसे अच्छा विकल्प यह है कि, (कोणीय स्रोत को संशोधित किए बिना और एक पुल अनुरोध सबमिट करने के बिना) यह वादा किया गया है कि क्या एक स्थानीय ध्वज रखना है। हर बार जब आप जिस वादे में रुचि रखते हैं उसे सेटअप करें और then()मूल वादे के लिए इसे पूरा के रूप में चिह्नित करें । $timeout then()मूल वादे को अभी तक हल किया है या नहीं, यह जानने के लिए झंडे की जाँच करें।

कुछ इस तरह:

var promiseCompleted = false;
promise.then(function(){promiseCompleted=true;})
$timeout(...).then(function(){if(!promiseCompleted)doStuff()})

क्रिश कोवल के कार्यान्वयन में वादे की स्थिति की जांच करने के अन्य तरीके शामिल हैं लेकिन यह प्रतीत होता है कि $qदुर्भाग्य से एंगुलर के कार्यान्वयन में ये शामिल नहीं हैं।


9
यहां .finally () का उपयोग करना बेहतर होगा। ऊपर दिया गया कोड केवल तभी वादा किया जाएगा जब वह सफलतापूर्वक हल हो जाए।
करणवीर कंग

8

यह संभव नहीं लगता, जैसा कि @shaunhusain ने पहले ही उल्लेख किया है। लेकिन शायद यह आवश्यक नहीं है:

// shows stuff from 3s ahead to promise completetion, 
// or does and undoes it in one step if promise completes before
$q.all(promise, $timeout(doStuff, 3000)).then(undoStuff);

या शायद बेहतर:

var tooSlow = $timeout(doStuff, 3000);
promise.always(tooSlow.cancel);

1

मुझे एक ऐसी ही समस्या हुई है जहां मुझे यह जांचने की आवश्यकता है कि क्या कोई वादा वापस आ गया है। चूँकि AngularJS का $watchफ़ंक्शन पृष्ठ को रेंडर करते हुए एक बदलाव दर्ज करेगा, भले ही नए और पुराने दोनों मान अपरिभाषित हों, मुझे यह देखने के लिए देखना होगा कि क्या मेरे बाहरी मॉडल में स्टोर करने लायक कोई डेटा है या नहीं।

यह निश्चित रूप से एक हैक है लेकिन मैं ऐसा करता हूं:

$scope.$watch('userSelection', function() {
  if(promiseObject.hasOwnProperty("$$v"){
    userExportableState.selection = $scope.userSelection;
  }
};

मुझे पता है कि $$vAngularJS द्वारा उपयोग किया जाने वाला एक आंतरिक चर है, लेकिन यह हमारे लिए एक हल किए गए वादे के संकेतक के रूप में काफी विश्वसनीय है। कौन जानता है कि जब हम AngularJS 1.2 में अपग्रेड करते हैं तो क्या होगा: - / मुझे $q1.2 डॉक्स में सुधार का कोई उल्लेख नहीं दिखता है, लेकिन शायद कोई क्यू के करीब एक बेहतर सुविधा के साथ एक प्रतिस्थापन सेवा लिख ​​देगा।


धन्यवाद, लेकिन "निजी" सदस्यों का उपयोग करने से बेहतर विकल्प हैं।
जैक्सन

0

मुझे आपके सटीक परिदृश्य का पता नहीं है, लेकिन एसिंक्रोनस कॉल करने के तुरंत बाद (और वादा करने के बाद) समय-समय पर जगह देना अधिक सामान्य है।

setTimeout()विवरण प्रदान करना अतुल्यकालिक कॉल के समान घटना थ्रेड में है, आपको रेस प्रभाव की संभावना के बारे में चिंता करने की आवश्यकता नहीं है। जैसा कि जावास्क्रिप्ट को कड़ाई से एकल पिरोया गया है, वादे के .then()कॉलबैक को बाद के ईवेंट थ्रेड में आग लगाने की गारंटी है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.