javascript Bluebird का वादा करता है और शाखाओं को पकड़ता है



node.js try-catch (1)

मैं सोच रहा हूं कि ब्लूबर्ड में एक तरह से कोई वादा करता है। फेंक दिया त्रुटि को .catch और उसके बाद कुछ विशिष्ट क्रियाओं को बिना शाखाओं (नेस्टेड .catch संसाधित करें।

कहो मेरे पास है

doSomethingAsync()
.then(function (result) {
  if (!result)
    throw new CustomError('Blah Blah');

  if (result == 0)
    throw new CustomError2('Blah Blah Blah');

  return result;
})
.then(function (result) {
  console.log('Success, great!');
})

.catch(CustomError, function (error) {
  // Oh CustomError!
  return saveSomethingAsync();
})
.then(function (saved) {
  // Should only be executed if an CustomError has been thrown
  console.log("Let's try again");
  return doSomethingAsync();
})

.catch(CustomError2, function (error) {
  // Oh CustomError2!
})
.delay(15000) // Don't try again now !
.then(function () {
  // Should only be executed if an CustomError2 has been thrown
  console.log("Let's try again after some long delay");
  return doSomethingAsync();
})

.catch(function (error) {
  // Should catch all random errors of the chain
})

जब मैं इस कोड को निष्पादित करता हूं, तो मुझे कई व्यवहार मिलते हैं:

  • यदि कोई त्रुटि नहीं फेंकता है, तो मुझे "सफलता, महान!" और इसे फिर से शुरू होता है "चलो कुछ देर देरी के बाद फिर से प्रयास करें"
  • यदि कस्टमएरर फेंकता है, तो मुझे "फिर से प्रयास करें" मिलता है
  • अगर CustomError2 फेंकता है, तो मुझे मिलती है "चलो कुछ देर देरी के बाद पुन: प्रयास करें"

इस प्रवाह के साथ क्या हो रहा है मैं समझ नहीं सकता नए वादे चेनों में त्रुटियों के विशिष्ट कोड को घोंसले के बदले कुछ ऐसा लिखना अच्छा होगा।


एक फेंक दिया त्रुटि .catch और फिर कुछ विशिष्ट क्रियाओं को बिना शाखाओं को संसाधित करें

नहीं, क्योंकि यह शाखाएं है घोंसले के शिकार पूरी तरह से प्राकृतिक यहाँ है। आप तुल्यकालिक try-catch रूपक रूपक का उपयोग करके इस बारे में सोच भी सकते हैं और यह वही होगा।

इस प्रवाह के साथ क्या हो रहा है मैं समझ नहीं सकता

  • अगर कोई त्रुटि नहीं फेंक जाती है, तो मुझे "सफलता, महान!" और इसे फिर से शुरू होता है "चलो कुछ देर देरी के बाद फिर से प्रयास करें"

एचएम, यह अजीब है, क्योंकि "चलो फिर से प्रयास करें" (बिना देरी के) उस से पहले जंजीर हो गया है आप अंततः दोनों लॉग प्राप्त करना चाहिए आपकी श्रृंखला क्रमिक रूप से संसाधित की जाती है:

doSomethingAsync() // returns a result
 then return result // first callback: continues with it
 then console.log('Success, great!') // next callback: logs something
 catch // is ignored because no rejection
 then console.log("Let's try again"); // next callback: logs something
      return doSomethingAsync();      //                and returns a result
 catch // that result, not being a rejection, is ignored here
 delay // fulfillment is delayed
 then console.log("Let's try again after some long delay"); // next callback again logs
      return doSomethingAsync();                            // and returns a result
 catch // is ignored again
  • अगर कोई CustomError फेंका जाता है, तो मुझे "फिर से प्रयास करें" मिलता है

हां, क्योंकि saveSomethingAsync(); , पिछले वादे के परिणाम, पूरा हो गया है, तो अगले। तब .then() श्रृंखला में कॉलबैक निष्पादित करता है।

  • अगर कस्टमएरर 2 फेंक दिया जाता है, तो मुझे "कुछ देर देरी के बाद दोबारा प्रयास करें"

हां, क्योंकि त्रुटि को सभी तरह से नीचे चला गया। .catch(CustomError2, …) जहां इसे अंततः संभाला गया था। अपने रास्ते पर, कोई कॉलबैक निष्पादित नहीं किया गया था। त्रुटि को संभालने के बाद, वादा पूरा हो गया है, और अगले। तब .then() श्रृंखला में कॉलबैक को कॉल किया गया है।

मुझे लगता है कि आप वास्तव में यहाँ क्या चाहते हैं

doSomethingAsync()
.then(function(result) {
  if (!result)
    // CustomError('Blah Blah');
    // Oh CustomError!
    return saveSomethingAsync();
    .then(function(saved) {
      console.log("Let's try again");
      return doSomethingAsync();
    });
  else if (result == 0)
    // CustomError2('Blah Blah Blah');
    // Oh CustomError2!
    return Promise.delay(15000) // Don't try again now !
    .then(function() {
      console.log("Let's try again after some long delay");
      return doSomethingAsync();
    })
  else
    console.log('Success, great!');
  // return undefined implied
}).catch(function (error) {
  // does catch all random errors of the chain
  // thrown by any of the doSomethingAsync() or of the saveSomethingAsync
})




bluebird