我无法迭代我的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停止。可能是什么问题?谢谢你的帮助
答案 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(),你可以简单地停止设置下一个超时,你的程序就会完成执行。