2017-12-15 4 views
0

Im Problem mit meinem Versprechen Iterieren durch und beende meine Parsercode:Node.js Promises Rekursion

let startFrom = 0, 
    totalRecords = 10000, 
    doneRecords = 0 
const rows = 10 

const parserRequests = function() { 
if (startFrom <= totalRecords) { 
    setTimeout(function() { 
     getParserOffers(startFrom) 
     startFrom += rows 
     parserRequests() 
    }, 2000) 
}} 

const getParserOffers = function (start) { 
request({ 
    uri: domain + '/lucene/search/filter?minPrice=0.00&maxPrice=639.63&stock=all&cat=0&sortOrder=added+desc&start=' + start + '&rows=' + rows + '&steam_app_id=&steam_category=&steam_prod_type=&includeOutOfStock=&includeFreeGames=false', 
    json: true 
}).then(response => { 
    const promises = response.docs.map(doc => getOffersData(doc)) 
    return Promise.all(promises) 
}).then(gamesList => { 
    doneRecords += rows 
    console.log('Done records: ', doneRecords) 
    if (doneRecords >= totalRecords) { 
     process.exit() 
    } 
}).catch(error => { 
    console.error('ERROR: Server did not respond') 
})} 

In rekursiven parserRequests Funktion, die ich bis totalrecords iterieren und in getParserOffers nach Spieleübersicht bekommt ich iterieren auch jedes Mal, wenn es ist fertig. Das Problem ist, dass doneRecords auch 10000 Nummer erreichen sollte, um process.exit() auszuführen und das Programm zu stoppen, aber es wird nie ausgeführt, es stoppt zum Beispiel auf 9750. Was kann das Problem sein? Vielen Dank für Ihre Hilfe

Antwort

0

Zunächst sieht es nicht wie getParserOffers() -Methode sequenziell ausgeführt wird. Es wird alle 2 Sekunden aufgerufen, und wenn der Host, den Sie abfragen, die elf HTTP-Anfragen pro Zeit nicht verarbeiten kann, werden Ihre Anfragen auf dem Host in die Warteschlange gestellt und Ihre Versprechen warten.

Ich denke, dass Sie damit nacheinander ausgeführt werden. Dafür benötigen Sie Ihr Versprechen zurückzukehren:

const getParserOffers = function (start) { 
    return request({ 

und heften sich an den nächsten Iteration über dann() -Methode:

if (startFrom <= totalRecords) { 
    setTimeout(function() { 
     getParserOffers(startFrom).then(_ => { 
      startFrom += rows 
      parserRequests() 
     }); 
    }, 2000); 
} 

Sie auch die Verzögerung verringern möchten, da es nun der Reihe nach würde ausführen einer nach demanderen.

ich auch diesen Teil zu ändern würde empfehlen:

doneRecords += rows 
console.log('Done records: ', doneRecords) 
if (doneRecords >= totalRecords) { 
    process.exit() 
} 

bewegen sie an den Ort, wo Sie den Timeout, Sie müssen nicht process.exit(), können Sie einfach aufhören das nächste Timeout einstellen und Ihr Programm würde die Ausführung beenden.