आधुनिक जे एस/वादा नौसिखिया यहाँ। इस विषय पर भारी मात्रा में सामग्री के बावजूद, मुझे एक साधारण प्रश्न का उत्तर खोजने में परेशानी हो रही है।

मेरा मानना ​​है कि मुझे JS प्रॉमिस की अच्छी समझ है (mdn और https://spin.atomicobject.com/2016/02/16/how-javascript-promises-work/)

मैंने वादों का नियमित रूप से उनके सरलतम रूप में उपभोग और उत्पादन किया है, हालाँकि मैं अपनी विरासत में मिली परियोजनाओं में निम्नलिखित पैटर्न के साथ तरीकों पर ठोकर खाता रहता हूँ:

const doAsyncOp = () => 
  $http.get(uri)
    .then(
      value => value,
      reject => //... 
    );

मेरा बड़ा सवाल है: क्या होता है जब आप अपने सफलता हैंडलर से एक मूल्य वापस कर देते हैं? मुझे इस विधि का उपभोग करने की आवश्यकता है, और क्लाइंट कोड में 'मान' तक पहुंच की आवश्यकता है। क्या यह तकनीकी रूप से अनियंत्रित है? क्या मुझे कार्यान्वयन को फिर से लिखना चाहिए?

1
Firephp 2 अप्रैल 2018, 22:20

3 जवाब

सबसे बढ़िया उत्तर

मेरा बड़ा सवाल है: क्या होता है जब आप अपने सफलता हैंडलर से एक मूल्य वापस कर देते हैं?

जब आप .then() हैंडलर से कोई मान लौटाते हैं, तो वह मान पैरेंट प्रॉमिस चेन का हल किया गया मान बन जाता है: तो, इस कोड में:

// utility function that returns a promise that resolves after a delay
function delay(t, v) {
    return new Promise(resolve => {
        setTimeout(resolve.bind(null, v), t);
    });
}

function test() {
    return delay(100, 5).then(val => {
        // this return value becomes the resolved value of the promise chain
        // that is returned from this function
        return 10;
    });
}

test().then(result => {
    // logs 10
    console.log(result);
});

जब आप इसे चलाते हैं, तो यह .then() हैंडलर में return 10 के कारण 10 लॉग करेगा।

.then() हैंडलर से चार संभावनाएं हैं:

  1. नियमित मान लौटाएं जैसे return 10 या return val. वह मूल्य वादा श्रृंखला का हल मूल्य बन जाता है। यदि कोई मान वापस नहीं किया जाता है (जिसका अर्थ है कि जावास्क्रिप्ट में वापसी मूल्य undefined है), तो वादा श्रृंखला का हल किया गया मूल्य undefined है।

  2. एक वादा वापस करें जो अंततः हल हो गया है या पहले ही हल हो चुका है। यह वादा श्रृंखला में जोड़ा जाता है और वादा श्रृंखला उस वादे के हल किए गए मूल्य पर ले जाती है।

  3. एक वादा वापस करें जो अंततः अस्वीकार कर दिया गया है या पहले ही खारिज कर दिया गया है। यह वादा श्रृंखला में जोड़ा जाता है और वादा श्रृंखला वापस किए गए वादे के अस्वीकृत कारण पर ले जाती है।

  4. अपवाद फेंको। अगर .then() हैंडलर के अंदर एक अपवाद फेंका जाता है, तो .then() इंफ्रास्ट्रक्चर इसे पकड़ लेगा और रिजेक्ट कारण सेट के साथ वादा श्रृंखला को एक अस्वीकृत स्थिति में बदल देगा। उस मूल्य के लिए जो फेंका गया है। इसलिए, यदि आप throw new Error("User not found") एक .then() हैंडलर के अंदर करते हैं, तो उस वादा श्रृंखला को उस त्रुटि ऑब्जेक्ट के साथ अस्वीकार कारण के रूप में अस्वीकार कर दिया जाएगा।


आपके विशिष्ट कोड में:

const doAsyncOp = () => 
  $http.get(uri)
    .then(
      value => value,
      reject => //... 
    );

value => value का कोई कारण नहीं है। value पहले से ही वादे का हल किया गया मूल्य है, आपको इसे फिर से सेट करने की आवश्यकता नहीं है।

और चूंकि वसा तीर फ़ंक्शन स्वचालित रूप से कोई एकल कथन देता है, आप पहले से ही $http.get().then() से अपने doAsyncOp() फ़ंक्शन में वादा वापस कर रहे हैं। तो, आप बस कर सकते हैं:

const doAsyncOp = () => $http.get(uri);

doAsyncOp().then(result => {
   // handle the result here
}).catch(err => {
   // handle error here
});
2
jfriend00 2 अप्रैल 2018, 21:45

मुझे लगता है कि आप async का उपयोग कर सकते हैं और हल किए गए मानों की प्रतीक्षा कर सकते हैं।

function delay(t, v) {
    return new Promise(resolve => {
        setTimeout(resolve.bind(null, v), t);
    });
}

async function(){
    await myData = delay(1000, 1000);

    console.log(myData);
}
0
Yonglin Li 20 अगस्त 2019, 14:32

इसे क्लाइंट कोड पर लाने के लिए, बस अपने फ़ंक्शन से वादा वापस करें:

const doAsyncOp = () => $http.get(uri)

फिर अपने ग्राहक में आप इसका उपयोग कर सकते हैं:

doAsyncOp()
.then(value => {
    // use value
}
.catch(err => { /* error */  }
1
Mark M 2 अप्रैल 2018, 19:31