javascript - "समय" लूप का वादा संस्करण क्या है?



node.js promise (1)

मुझे एहसास हुआ कि जब से ईसीएमएस्क्रिप्ट 6 में वादों की वजह से अतुल्यकालिक कार्यों की तुल्यकालिक कोडिंग की अनुमति मिलती है, तो प्रत्येक वादे के लिखित टुकड़े के लिए एक तुल्यकालिक परिणाम होता है। उदाहरण के लिए:

var data = processData(JSON.parse(readFile(getFileName())));

के समान है:

var data = getFileName()
    .then(readFile)
    .then(JSON.parse)
    .then(processData);

अब मेरे वर्तमान उपयोग-मामले के लिए मैं एक विशाल सार्वजनिक एपीआई से डेटा खींचने के लिए कोड लिखना चाहता हूं। एपीआई पृष्ठांकित है, इसलिए एक विशुद्ध रूप से तुल्यकालिक दुनिया में मैं निम्नलिखित की तरह कुछ लिखूंगा:

var data = [];
var offset = 0;
var total = 10000; // For example - not actually how this would work
while( offset < total ) {
    data.concat(getDataFromAPI(offset));
    offset = data.length;
}

अब मेरा सवाल है, मैं यह कैसे वादा करता हूँ? मैं कुछ ऐसा लिख ​​सकता हूं:

var data = [];
var offset = 0;
var total = 10000;
getDataFromAPI(offset)
    .then(function(newData){
        data.concat(newData);
        return getDataFromAPI(data.length);
    });

लेकिन इस बिंदु पर मुझे सिर्फ चेन अनंत के लिए मजबूर किया जाता है। तब एस - कोई लूपिंग तर्क नहीं है मुझे लगता है कि रिकर्सन का उपयोग करना संभव है, लेकिन मुझे नहीं पता कि यह कैसे करना है।

मैं अपने वाद्य पुस्तकालय के रूप में BluebirdJS का उपयोग कर रहा हूं, इसलिए मेरे पास सभी सहायक विधियों तक पहुंच है।


मुझे लगता है कि रिकर्सन के उपयोग से कुछ संभव होना चाहिए

ठीक ठीक। आप कॉलबैक को नाम दे सकते हैं ताकि आप उसे पुनः संदर्भ दे सकें। जब तक स्थिति पूरी नहीं हुई है, तब तक कॉलबैक से एक वादा वापस करें। अन्यथा अंतिम परिणाम लौटाएं:

getDataFromAPI(offset)
  .then(function next(newData){
    data.concat(newData);
    var newOffset = data.length;
    return newOffset < total ? getDataFromAPI(newOffset).then(next) : data;
  })
  .then(function(data) {
    console.log(data); // final result
  });




bluebird