मैं वादों से जूझ रहा हूं

निम्नलिखित स्निपेट होना:

Promise.resolve()
    .then(a("OK1"))
    .then(a("OK2"))
    .then(a("OK3"))
    .then(a("OK4"))
    .then(a("OK5"))
    .then(function() {
        console.log("FINISH");
    })
    .catch(function(e) {
      
        console.log("ERROR: " + e);
    });


function a(i) {
    return new Promise(function(resolve, reject) {
        
        if(i == "OK4") {
           console.log("THROW");
           throw('Error'); //This does not happen
           reject();
           return;
        }
        if(i == "OK2") {
          reject()
          return;
        }
        console.log(i);
        resolve();
    });
}

मैं एक वादे को अस्वीकार करने में सक्षम होना चाहता हूं - फिर अगला .then निष्पादित किया जाता है ("OK3") लेकिन मैं अपवादों को फेंकने में असमर्थ हूं - मैं "OK4" पर .catch को ट्रिगर करना चाहता हूं

OK4 - अस्वीकार कर दिया गया है और आउटपुट नहीं किया गया है, लेकिन OK5 अभी भी निष्पादित हो जाता है - क्या इसके आसपास कोई रास्ता है?

यह मेरा अपेक्षित आउटपुट होगा:

OK1
OK3
ERROR: ....
0
Helmut Januschka 1 सितंबर 2016, 09:08
4
आपको एक फ़ंक्शन then पास करना होगा, वादा नहीं। आप अपने सभी कार्यों को बिना किसी जंजीर के निष्पादित कर रहे हैं।
 – 
Bergi
1 सितंबर 2016, 09:14
ठीक है और मैं async फ़ंक्शन पर एक संकल्प को कैसे संभालूं? फ़ंक्शन ए (एक्स) {सेटटाइमआउट (फ़ंक्शन () {// यहां से कैसे हल करें?}, 2000);
 – 
Helmut Januschka
1 सितंबर 2016, 09:16
आपको इसे Promise कंस्ट्रक्टर कॉल में उसी तरह लपेटना होगा जैसे आपने अपने प्रश्न में किया था, ताकि resolve क्लोजर के माध्यम से उपलब्ध हो। सुनिश्चित नहीं हैं कि मैं प्रश्न को समझता हूँ?
 – 
Bergi
1 सितंबर 2016, 09:20
यह ठीक है: gist.github.com/hjanuschka/45a86a1c078550e0d8836e3550108cd7 पर काम करता है जहां सेटटाइमआउट के बिना - यह काम नहीं करता - ऐसा क्यों है? बिना सेटटाइमआउट () -> उसे ले लो।
 – 
Helmut Januschka
1 सितंबर 2016, 09:27
आप अभी भी then (दोनों में से किसी एक में) फ़ंक्शन पास नहीं कर रहे हैं, इसलिए मुझे संदेह है कि कुछ भी काम करता है।
 – 
Bergi
1 सितंबर 2016, 09:34

1 उत्तर

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

जैसा कि बर्गी ने उल्लेख किया है, आप जिस पैरामीटर को प्रत्येक .then पर पास कर रहे हैं, वह तुरंत फ़ंक्शन चलाता है और एक वादा वापस करता है। वादा श्रृंखला को उस फ़ंक्शन के संदर्भ की आवश्यकता होती है जिसे वह बाद की तारीख में चला सकता है।

यदि आप अपने फ़ंक्शन को एक पैरामीटर के साथ चलाना चाहते हैं, तो आप इसे एक अनाम फ़ंक्शन में लपेट सकते हैं ताकि वादा श्रृंखला बाद में अनाम फ़ंक्शन को चला सके।

a("OK1")
  .then((res)=>{
    return a("OK2")
  })
  .then((res)=>{
    return a("OK3")
  })
  .then((res)=>{
    return a("OK4")
  })
  .then((res)=>{
    return a("OK5")
  })
  .then(()=>{
    console.log("FINISH");
  })
  .catch(function(e) {
    console.log("ERROR: " + e);
  });


function a (i) {
    return new Promise(function(resolve, reject) {

        if(i == "OK4") {
           console.log("THROW");
           throw new Error(i); //This does not happen
        }
        if(i == "OK2") {
          return reject(new Error(i))
        }
        setTimeout(function () {
          console.log(i);
          resolve(i); 
        }, 100)
    });
}

एक फ़ंक्शन पास करना ठीक है जो अंततः एक वादा वापस कर देगा। फ़ंक्शन को उस मान को पारित किया जाएगा जिसे पिछले वादे के साथ हल किया गया था।

b(1)
  .then(b)
  .then(b)
  .then(b)
  .then((res) => {
    console.log("FINISH",res);
  })
  .catch(function (e) {
    console.log("ERROR: " + e);
  });

function b (i) {
  return new Promise(function (resolve, reject) {
    console.log(i)
    resolve(i+1)
  })
}
1
Matt 1 सितंबर 2016, 11:52
धन्यवाद, जैसा कि @Bergi ने उल्लेख किया है कि मुख्य समस्या यह थी कि मैट की भिन्नता में परिवर्तन करने वाला कार्य किया गया था। thx दोस्तों
 – 
Helmut Januschka
1 सितंबर 2016, 13:33