【问题标题】:Node.js Promises recursionNode.js 承诺递归
【发布时间】:2018-05-29 11:57:47
【问题描述】:

我在遍历我的 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 上停止。可能是什么问题?谢谢你的帮助

【问题讨论】:

    标签: javascript node.js recursion promise


    【解决方案1】:

    首先,getParserOffers() 方法看起来不像是按顺序执行的。它每 2 秒调用一次,如果您查询的主机在给定时间内无法处理 11 个 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(),你可以简单地停止设置下一个超时,你的程序就会完成执行。

    【讨论】:

      猜你喜欢
      • 2018-05-28
      • 2014-02-04
      • 1970-01-01
      • 2014-06-30
      • 2017-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多