फिर अंदर से एक वादे को कैसे अस्वीकार करें


85

यह संभवतः एक मूर्खतापूर्ण प्रश्न है, लेकिन मध्य वादा श्रृंखला, आप तत्कालीन कार्यों में से एक के वादे को कैसे अस्वीकार करते हैं? उदाहरण के लिए:

someActionThatReturnsAPromise()
    .then(function(resource) {
        return modifyResource(resource)
    })
    .then(function(modifiedResource) {
        if (!isValid(modifiedResource)) {
            var validationError = getValidationError(modifiedResource);
            // fail promise with validationError
        }
    })
    .catch(function() {
        // oh noes
    });

मूल संकल्प / अस्वीकार फ़ंक्शन या PromiseResolver का संदर्भ नहीं है। क्या मैं सिर्फ जोड़ने वाला हूं return Promise.reject(validationError);?


1
throw validationError
कावुन

> <मुझे लग रहा था कि यह कुछ मूर्खतापूर्ण / आसान होगा। मुझे लगता है कि मुझे लगता है कि मुझे एक समर्पित अस्वीकृति समारोह को कॉल करना पड़ा या इसके बजाय एक असफल वादा वापस करना पड़ा। तो किसी वादे / व्यवहार के अंदर से, कोई भी लौटाया गया मूल्य जो एक नया वादा नहीं है, उसे हल किया गया मूल्य माना जाएगा? और अगर मैं एक त्रुटि फेंक देता हूं, तो वह तुरंत अस्वीकार किए गए वादे को वापस करने के समान है? यदि आप उत्तर के रूप में पोस्ट करते हैं तो मैं इसे स्वीकार करूंगा।
चिनाबफेट

आप शायद यहां स्वीकृत उत्तर की तलाश कर रहे हैं stackoverflow.com/questions/17800176/…
crad

जवाबों:


96

क्या मैं सिर्फ जोड़ने वाला हूं return Promise.reject(validationError);?

हाँ। हालाँकि, यह केवल jQuery में जटिल है , एक वादा / ए + -प्रमाणित पुस्तकालय के साथ आप बस भी कर सकते हैं

throw validationError;

तो आपका कोड तब दिखेगा

someActionThatReturnsAPromise()
    .then(modifyResource)
    .then(function(modifiedResource) {
        if (!isValid(modifiedResource))
            throw getValidationError(modifiedResource);
        // else !
        return modifiedResource;
    })
    .catch(function() {
        // oh noes
    });

3
क्या यह एक नियमित बात है? क्या इसका व्यापक रूप से उपयोग किया जाता है? मुझे ऐसा करना बुरा लग रहा है, क्योंकि अगर कहीं कोड .catchगायब है, तो पूरा ऐप अनचाही त्रुटि के साथ उड़ जाएगा ..
एंड्री पोपोव

3
ध्यान दें कि एक वादा / ए + अनुरूप पुस्तकालय में आप थ्रो का उपयोग कर सकते हैं क्योंकि इसके handlerलिए thenसिंक है और अपवाद को पकड़ा जा सकता है। यदि हैंडलर असंक है, तो उसे अंततः अस्वीकार करने का वादा वापस करना होगा। इसलिए हमेशा फेंकने के बजाय Promise.reject () वापस करना मेरे लिए समझ में आता है। क्योंकि यदि आप एक async हैंडलर में फेंकते हैं, तो पुस्तकालय इसे पकड़ नहीं सकता है और यह चुपचाप पास हो जाएगा। खबरदार।
माइक ग्लीसन जूनियर कॉट्यूरियर

1
@MikeGleasonjrCouturier: कोई ऐसा async हैंडलर नहीं होना चाहिए जो .thenकिसी वादे पर हैंडलर न हों :-) यदि आप एक प्रॉमिस नहीं किया गया एपीआई का उपयोग कर रहे हैं, तो भी return Promise.reject()आपकी मदद करेगा।
बरगी

@Bergi मेरा मतलब था: p.then(function() { doAsync(function() { throw new Error("won't catch"); }); }); EDIT: ओह ठीक है मैंने आपकी टिप्पणी को फिर से पढ़ा, मैं पूरी तरह से आपके साथ हूं, हम उसी पृष्ठ पर हैं! मैं इसे ओपी को इंगित करना चाहता था :)
माइक ग्लेनसन जूनियर कॉट्यूरियर

1
@MikeGleasonjrCouturier: हाँ, यह बिल्कुल वही है जो मैं कह रहा था। और doAsync(function() { return Promise.reject(new Error("won't catch, won't throw")); })वहाँ काम नहीं करता है - यह सिर्फ चुपचाप विफल रहता है। यह वास्तव में होना चाहिए doAsync().then(function() { throw new Error("will be caught"); })जब आप वादों के साथ काम कर रहे हों।
बर्गी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.