मैं बैकएंड सेवा से डेटा ला रहा हूं, एक बार में 20 परिणाम। मैं इस कार्यान्वयन विवरण को छिपाना चाहता हूं और एक जनरेटर बनाना चाहता हूं जो तब तक रिकॉर्ड लौटाता रहे जब तक मुझे उनकी आवश्यकता हो (जब तक वे उपलब्ध हों)।

निष्पक्ष कार्यान्वयन:

function* getEndlessRecords(fetchingFunction) {
  const batchSize = 20;

  // endless loop:
  for (let offset = 0; true; offset += batchSize) {
    fetchingFunction(offset, batchSize)
      .then(records => {
        for (let i=0; i < records.length; i++) {
          yield records[i]; // THIS DOESN'T WORK!!!
        }
      })
  }
}

(टाइपो हो सकता है - यह सरलीकृत कोड है)

मैं समझता हूं कि यह क्यों काम नहीं करता है (yield अंतरतम फ़ंक्शन पर काम करता है), हालांकि मुझे एसिंक फ़ंक्शन के आसपास जनरेटर बनाने का एक अच्छा तरीका नहीं मिल रहा है।

क्या जनरेटर के लिए एसिंक्स फ़ंक्शंस से आउटपुट का उपभोग करना संभव है?

1
johndodo 11 सितंबर 2018, 14:56

1 उत्तर

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

ES2018 के अनुसार, आप एक async जनरेटर फ़ंक्शन का उपयोग कर सकते हैं:

async function* getEndlessRecords(fetchingFunction) {
  const batchSize = 20;

  // endless loop:
  for (let offset = 0; true; offset += batchSize) {
    const records = await fetchingFunction(offset, batchSize);
    for (let i=0; i < records.length; i++) {
      yield records[i];
    }
  }
}

आप इसे async फ़ंक्शन में for-await-of (for-of नहीं) का उपयोग करके उपभोग करेंगे:

for await (const value of getEndlessRecords(/*...*/)) {
    // Do something with `value`
}

...या केवल इसकी next विधि को कॉल करके और परिणाम की प्रतीक्षा करके:

let g = getEndlessRecords(/*...*/);
let result;
while (!(result = await g.next()).done) {
    console.log(result.value);
}

...या निश्चित रूप से, एक गैर-async फ़ंक्शन में, आप g.next() के परिणाम पर then का उपयोग करेंगे।

ES2018 के async जनरेटर फ़ंक्शन सिंटैक्स से पहले, आपको function* सिंटैक्स का उपयोग करने के बजाय जनरेटर को हैंड-कोड करना होगा। ऐसा यकीनन-मेंसही ढंग से करना (%GeneratorPrototype% के लिए किसी एक्सटेंशन की अनुमति नहीं देना) काफी आसान है। ऐसा सही ढंग से करना काफी अजीब है, क्योंकि %GeneratorPrototype% में सार्वजनिक रूप से सुलभ प्रतीक नहीं है और आपको इसे खोजना होगा।

4
T.J. Crowder 11 सितंबर 2018, 15:05