Node.js承诺递归

时间:2017-12-15 09:41:52

标签: javascript node.js recursion promise

我无法迭代我的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,在getParserOffers中获取gamesList后,我也会在每次完成时迭代。问题是doneRecords还应该达到10000个数字来执行process.exit()并停止程序,但它永远不会,例如在9750停止。可能是什么问题?谢谢你的帮助

1 个答案:

答案 0 :(得分:0)

首先,它看起来并不像getParserOffers()方法那样顺序执行。它每2秒调用一次,如果您查询的主机无法在每个给定时间内处理11个HTTP请求,那么您的请求将在主机上排队,您的承诺将等待堆叠。

我认为你的意思是按顺序执行。为此你需要回复你的承诺:

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(),你可以简单地停止设置下一个超时,你的程序就会完成执行。