javascript - नतीजतन, नतीजतन से नतीजतन नॉन न बार(प्रयासों के बीच देरी के साथ)



node.js async-await (1)

हमें एक Node.js फ़ंक्शन लिखने की ज़रूरत है जो पहले अनुरोध किए गए गणना के परिणाम के लिए एक निश्चित एपीआई समापन बिंदु का चुनाव करता है। नतीजा उत्पन्न करने के लिए एक यादृच्छिक समय लगता है और मुझे बिल्कुल भी तैयार नहीं किया जा सकता है। हम जितनी जल्दी हो सके इसे प्राप्त करना चाहते हैं, लेकिन मैं भी बहुत लंबा इंतजार नहीं करना चाहता, जिसका मतलब है कि एक निश्चित संख्या के एपीआई कॉल के बाद हम चाहते हैं कि फ़ंक्शन विफल हो जाए (वादा अस्वीकार करें)

हमारे कोड और एपीआई के बीच एक तरह से संचार होता है।

const Bluebird = require('bluebird');

function getResult() {
  return new Bluebird(async function (resolve, reject) {

    let counter = 0;

    while (counter < 10) {
      await Bluebird.delay(1000);

      const res = await apiCall();
      if (res.data) {
        resolve(res.data);
      } else {
        counter += 1;
      }
    }

    reject('timeout');
  });
}

क्या यह सही दृष्टिकोण है?


नहीं। यह Promise निर्माता निर्माता antipattern के async / await संस्करण है! जब आप निस्तारण करते हैं, या जब एक अपवाद फेंका जाता है (जैसे जब res null ) को अस्वीकार करते हैं तो यह पाश को भी बंद नहीं करेगा।
आपको उपयोग करना चाहिए

async function getResult() {
  for (let counter = 0; counter < 10; counter += 1) {
    await Bluebird.delay(1000);
    const res = await apiCall();
    if (res.data) {
      return res.data;
    }
  }
  throw new Error('timeout');
}

यदि आप यह सुनिश्चित करना चाहते हैं कि एक ब्लूबर्ड वायर्ड लौटा दिया गया है, मूल नहीं है, तो इसे Bluebird.method में लपेटें या Bluebird.method का उपयोग करने के लिए अपने पारदर्शीकरण को बताएं।





bluebird