फिर वादे में अगर-और कैसे संभाला जाए?


86

किसी मामले में, जब मुझे एक वादे की वस्तु से वापसी मूल्य मिलता है, तो मुझे दो अलग-अलग then()प्राथमिकताओं को शुरू करने की आवश्यकता होती है, जो मूल्य की स्थिति पर निर्भर करते हैं, जैसे:

promise().then(function(value){
    if(//true) {
        // do something
    } else {
        // do something 
    }
})

मैं सोच रहा हूँ शायद मैं इसे लिख सकता हूँ:

promise().then(function(value){
    if(//true) {
        // call a new function which will return a new promise object
        ifTruePromise().then();
    } else {
        ifFalsePromise().then();
    }
})

लेकिन इसके साथ, मेरे दो सवाल हैं:

  1. मुझे यकीन नहीं है कि यह एक नया वादा शुरू करने के लिए एक अच्छा विचार है-फिर एक वादे में प्रक्रिया;

  2. क्या होगा अगर मुझे आखिरी में एक फ़ंक्शन को कॉल करने के लिए दो प्रक्रिया की आवश्यकता है? इसका मतलब है कि उनके पास एक ही "टर्मिनल" है

मैंने मूल श्रृंखला को बनाए रखने के लिए नया वादा वापस करने की कोशिश की:

promise().then(function(value){
    if(//true) {
        // call a new function which will return a new promise object
        // and return it
        return ifTruePromise();
    } else {
        // do something, no new promise
        // hope to stop the then chain
    }
}).then(// I can handle the result of ifTruePromise here now);

लेकिन इस मामले में, चाहे वह सच हो या गलत, अगला thenकाम करेगा।

तो, इसे संभालने के लिए सबसे अच्छा अभ्यास क्या है?


1
यह वही हो सकता है जो आप stackoverflow.com/questions/26599798/… के लिए देख रहे हैं ?
विनायरा

जवाबों:


60

जब तक आपके कार्य एक वादा वापस करते हैं, तब तक आप अपने द्वारा सुझाई गई पहली विधि का उपयोग कर सकते हैं।

नीचे दी गई फ़ेल्ड से पता चलता है कि आप पहले हल किए गए मूल्य के आधार पर अलग-अलग चेनिंग पथ ले सकते हैं।

function myPromiseFunction() {
	//Change the resolved value to take a different path
    return Promise.resolve(true);
}

function conditionalChaining(value) {
    if (value) {
        //do something
        return doSomething().then(doSomethingMore).then(doEvenSomethingMore);
    } else {
        //do something else
        return doSomeOtherThing().then(doSomethingMore).then(doEvenSomethingMore);
    }
}

function doSomething() {
    console.log("Inside doSomething function");
    return Promise.resolve("This message comes from doSomeThing function");
}

function doSomeOtherThing() {
    console.log("Inside doSomeOtherthing function");
    return Promise.resolve("This message comes from doSomeOtherThing function");
}

function doSomethingMore(message) {
    console.log(message);
    return Promise.resolve("Leaving doSomethingMore");
}

function doEvenSomethingMore(message) {
    console.log("Inside doEvenSomethingMore function");
    return Promise.resolve();
}

myPromiseFunction().then(conditionalChaining).then(function () {
    console.log("All done!");
}).
catch (function (e) {

});

आप केवल एक सशर्त जंजीर बना सकते हैं, एक चर के लिए वापसी का वादा सौंप सकते हैं और फिर उन कार्यों को निष्पादित कर सकते हैं जिन्हें किसी भी तरह से चलाया जाना चाहिए।

function conditionalChaining(value){
    if (value) {
        //do something
        return doSomething();
    } else{
        //do something else
        return doSomeOtherThing();
    }
}

var promise = myPromiseFunction().then(conditionalChaining);

promise.then(function(value){
    //keep executing functions that should be called either way
});

4

मैंने सशर्त वादा उपयोग के लिए एक सरल पैकेज लिखा है।

यदि आप इसे देखना चाहते हैं:

npm पेज: https://www.npmjs.com/package/promise-tree

और गितुब: https://github.com/shizongli94/promise-tree

पैकेज की समस्या को हल करने के तरीके पूछने वाले टिप्पणियों के जवाब में:

1, इसकी दो वस्तुएं हैं।

2, इस पैकेज में ब्रांच ऑब्जेक्ट ऑनफुल और ऑनराइक्ड जैसे फ़ंक्शंस के लिए एक अस्थायी स्टोरेज जगह है जिसे आप तब () या कैच () में उपयोग करना चाहते हैं। इसमें तब () और कैच () जैसे तरीके होते हैं जो प्रोमिस में समकक्षों के समान तर्क लेते हैं। जब आप Branch.then () या Branch.catch () में कॉलबैक में पास होते हैं, तो Promise.then () और Promise.catch () के समान सिंटैक्स का उपयोग करें। फिर एक ऐरे में कॉलबैक को स्टोर करने के अलावा कुछ नहीं करें।

3, कंडीशन एक JSON ऑब्जेक्ट है जो जाँच और ब्रांचिंग के लिए शर्तों और अन्य जानकारी संग्रहीत करता है।

4, आप वादा कॉलबैक में कंडीशन ऑब्जेक्ट का उपयोग करके शर्तों (बूलियन एक्सप्रेशन) को निर्दिष्ट करते हैं। स्थिति तब आपके द्वारा पास की जाने वाली जानकारी को संग्रहीत करती है। उपयोगकर्ता द्वारा सभी आवश्यक जानकारी प्रदान किए जाने के बाद, स्थिति ऑब्जेक्ट पूरी तरह से नई प्रोमिस ऑब्जेक्ट के निर्माण के लिए एक विधि का उपयोग करता है जो शाखा वस्तु में पहले से संग्रहीत वादा और कॉलबैक जानकारी लेता है। यहाँ थोड़ा मुश्किल हिस्सा यह है कि आप (कार्यान्वयनकर्ता के रूप में, उपयोगकर्ता नहीं) को संग्रहीत कॉलबैक का पीछा करने से पहले मैन्युअल रूप से आपके द्वारा निर्मित वादा को अस्वीकार / अस्वीकार करना होगा। ऐसा इसलिए है क्योंकि अन्यथा, नया वादा श्रृंखला शुरू नहीं होगी।

5, ईवेंट लूप के लिए धन्यवाद, आपके द्वारा एक स्टेम प्रॉमिस ऑब्जेक्ट के पहले या बाद में ब्रांच ऑब्जेक्ट्स को त्वरित किया जा सकता है और वे एक दूसरे के साथ हस्तक्षेप नहीं करेंगे। मैं यहां "शाखा" और "स्टेम" शब्दों का उपयोग करता हूं क्योंकि संरचना एक पेड़ जैसा दिखता है।

उदाहरण कोड npm और github दोनों पृष्ठों पर पाया जा सकता है।

वैसे, यह कार्यान्वयन आपको एक शाखा के भीतर शाखाएं भी सक्षम बनाता है। और शाखाओं को उसी स्थान पर नहीं होना चाहिए जहां आप शर्तों की जांच करते हैं।


ऐसा लगता है कि आप उत्तर के बजाय टिप्पणियाँ प्रदान कर रहे हैं। एक बार आपके पास पर्याप्त प्रतिष्ठा होने के बाद आप किसी भी पोस्ट पर टिप्पणी कर पाएंगे । इसके अलावा मैं क्या कर सकता हूं इसकी जांच करें ।
thewaywewere

@ अन्य मार्ग, मैंने आपके अनुरोध का जवाब देते हुए कार्यान्वयन विवरण जोड़ दिए हैं।
szl1919

0

यह है कि मैंने इसे अपने भ्रूण में कैसे किया () मुझे यकीन नहीं है कि यह सही तरीका है, लेकिन यह काम करता है

 fetch().then(res => res.ok ? res : false).then(res => {
    if (res) {
        //res ok
    } else {
       //res not ok
    }

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