Angular.js में एक वादा पूरा होने पर हमेशा कुछ कोड कैसे चलाएं


83

मेरे Angular.js एप्लिकेशन में, मैं कुछ एसिंक्रोनस ऑपरेशन चला रहा हूं। इससे पहले कि मैं शुरू करता हूं, मैं एक मोडल डिव के साथ एप्लिकेशन को कवर करता हूं, फिर एक बार ऑपरेशन पूरा हो जाने के बाद, मुझे डिव को निकालने की जरूरत है, चाहे ऑपरेशन सफल रहा हो या नहीं।

वर्तमान में मेरे पास यह है:

LoadingOverlay.start(); 
Auth.initialize().then(function() {
    LoadingOverlay.stop();
}, function() {
    LoadingOverlay.stop(); // Code needs to be duplicated here
})

यह अच्छी तरह से काम करता है, हालांकि मैं इस छद्म कोड की तरह कुछ क्लीनर रखना पसंद करूंगा:

LoadingOverlay.start(); 
Auth.initialize().finally(function() { // *pseudo-code* - some function that is always executed on both failure and success.
    LoadingOverlay.stop();
})

मुझे लगता है कि यह काफी सामान्य समस्या है, इसलिए मैं सोच रहा था कि यह किया जा सकता है, लेकिन डॉक में कुछ भी नहीं मिल सकता है। किसी भी विचार अगर यह किया जा सकता है?


आप श्रृंखला एक कर सकते हैं then(), तो आप निश्चित रूप से एक और श्रृंखला कर सकते हैं ... .initialize().then(...).then(...)। ऐसा कोई "अंत में" नहीं है; अंतिम हैंडलर अंतिम एक निर्दिष्ट है।
चुकंदर-चुकंदर

2
@ चुकंदर-चुकंदर, वह काम नहीं करेगा क्योंकि यदि initialize()विफल रहता है, तो आपको अभी भी एक "सफलता" फ़ंक्शन और "विफल" फ़ंक्शन और डुप्लिकेट कोड दोनों को घोषित करने की आवश्यकता है।
लौरेंट

काम नहीं करेंगे, या सिर्फ अयोग्य?
चुकंदर-चुकंदर

1
लॉरेंट, जो आप चाहते हैं वह वर्तमान में एंगुलर की हल्की $ q सेवा में उपलब्ध नहीं है, जो कि सिर्फ एक विधि के साथ वादे प्रदान करता है, .then()- "प्रॉमिस एपीआई" यहां देखें । एकमात्र स्वतंत्रता के लिए एक .then()या कई .then()एस श्रृंखला है । आप एक अधिक व्यापक वादा एपीआई के लिए इच्छा करने वाले पहले नहीं हैं - जिस सुविधा को आप चाहते हैं वह औपचारिक रूप से यहां अनुरोध किया गया है
चुकंदर-चुकंदर

1
स्पष्ट रूप always(callback)से कोणीय 1.2.6 में कार्यान्वित या वापस नहीं किया गया है। हमें finallyअभी उपयोग करना है। मुझे आश्चर्य है कि आरक्षित शब्द finallyसे बेहतर क्यों है always
ऐलना

जवाबों:


164

इस पुल अनुरोध में यह सुविधा लागू कर दी गई है और अब यह AngularJS का हिस्सा है। इसे शुरू में "हमेशा" कहा जाता था और फिर बाद में इसका नाम बदल दिया गया finally, इसलिए कोड इस प्रकार होना चाहिए:

LoadingOverlay.start(); 
Auth.initialize().then(function() {
    // Success handler
}, function() {
    // Error handler
}).finally(function() {
    // Always execute this on both error and success
});

ध्यान दें कि चूंकि finallyएक आरक्षित कीवर्ड है, इसलिए इसे एक स्ट्रिंग बनाने के लिए आवश्यक हो सकता है ताकि यह कुछ ब्राउज़रों (जैसे IE और एंड्रॉइड ब्राउज़र) पर टूट न जाए:

$http.get('/foo')['finally'](doSomething);

10
वेब खोज से किसी को भी इसे खोजने के लिए, उत्तर में लिंक फ़ंक्शन को संदर्भित करता है alwaysलेकिन इसे बदल दिया गया था finallyजैसा कि आप इस कमिट में देख सकते हैं (या स्रोत में): github.com/angular/angular.js/commit/…
ऑस्टिन थॉम्पसन

@AustinThompson, जानकारी के लिए धन्यवाद, मैंने पोस्ट अपडेट कर दी है।
लौरेंट

@ this.lau_ क्या अंत में () श्रृंखला में अंतिम कॉल होना चाहिए, या क्या मैं इसे फिर से () बंद कर सकता हूं?
ब्रायन

2
आपने सर, मेरा दिन बना दिया!
याकूब

4
@ ब्रायन finallyबाकी की तरह एक वादा वापस करता है, इसलिए आप इसे चेन कर सकते हैं। हालाँकि (कम से कम एंगुलर के कुछ संस्करणों पर) सुविधा ओवरलोड हो जाती है successऔर errorकेवल तत्काल रिटर्न में जोड़ी जाती है $http, इसलिए यदि आप शुरू करते finallyहैं तो आप उन तरीकों को खो देंगे।
drzaus

7

मैं AngularJS संस्करण 1.1.5 के साथ Umbraco संस्करण 7.3.5 बैक एंड का उपयोग कर रहा हूं और इस धागे को पाया। जब मैंने स्वीकृत उत्तर लागू किया तो मुझे त्रुटि मिली:

xxx (...)। तब (...) अंत में एक फ़ंक्शन नहीं है

क्या काम किया है लेकिन था always। यदि कोई भी अन्य व्यक्ति AngularJS के पुराने संस्करण का उपयोग करता है, तो उसे यह धागा मिल जाता है और वह finallyइस कोड का उपयोग नहीं कर सकता

LoadingOverlay.start(); 
Auth.initialize().then(function() {
    // Success handler
}, function() {
    // Error handler
}).always(function() {
    // Always execute this on both error and success
});

2

कोणीयजेएस का उपयोग नहीं करने वालों के लिए, और यदि आप त्रुटि को पकड़ने के साथ ठीक हैं (निश्चित नहीं कि अगर .finally () ऐसा करेंगे), तो आप .catch () का उपयोग कर सकते हैं। (तब) डुप्लिकेट कोड से बचने के लिए।

Promise.resolve()
  .catch(() => {})
  .then(() => console.log('finally'));

लॉग या अन्य सफाई के लिए कैच () वैसे भी उपयोगी हो सकता है। https://jsfiddle.net/pointzerotwo/k4rb41a7/


1

मैं पृष्ठ की सामग्री को प्रस्तुत करने और घटना $ $CententLoaded पर आप मॉडल को हटाने ट्रिगर करने के लिए ngView का उपयोग करेगा। उस घटना के लिए http://docs.angularjs.org/api/ng.directive:ngView देखें और http://docs.angularjs.org/api/ng । $ RootScope.Scope पर इवेंट श्रोता के लिए $।

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