簡體   English   中英

Node.js承諾遞歸

[英]Node.js Promises recursion

我在遍歷Promises和完成解析器代碼時遇到麻煩:

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')
})}

在遞歸的parserRequests函數中,我迭代直到totalRecords,並在獲取gamesList之后在getParserOffers中進行迭代,每次完成時我也會進行迭代。 問題在於,doneRecords也應該達到10000號才能執行process.exit()並停止程序,但是它從不停止,例如在9750上停止。這可能是什么問題? 謝謝你的幫助

首先,看起來getParserOffers()方法不是順序執行的。 它每2秒調用一次,並且如果您查詢的主機在給定的時間內無法處理十一個HTTP請求,則您的請求將在主機上排隊,並且Promise會等待。

我認為您的意思是按順序執行。 為此,您需要兌現您的承諾:

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

並通過then()方法將其附加到下一次迭代:

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

您可能還想減少延遲,因為它現在可以一個接一個地順序執行。

我還建議更改此部分:

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

將其移至您設置超時的位置,而不必進行process.exit(),只需停止設置下一個超時即可,程序將完成執行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM