gpt4 book ai didi

javascript - 调用数量可变且相互依赖的异步函数

转载 作者:行者123 更新时间:2023-12-01 03:41:52 25 4
gpt4 key购买 nike

我正在尝试对网站进行分页,为了请求下一页,需要当前页面上的信息。

function paginateSite(numPages, cb) {
var stringToGetToNextPage = ''
for (var i = 0; i < numPages; i++) {
(function(i, stringToGetToNextPage) {
request({
url: 'http://website.com',
qs: {
nextPage: stringToGetToNextPage
}
},
function(err, res, body) {
body_json = JSON.parse(body)
console.log(body_json.stringToGetToNextPage)
})
})(i, stringToGetToNextPage)
}
}

如您所见,我无法在匿名函数之外设置 stringToGetToNextPage。我浏览了异步库文档,但找不到任何可以解决我的问题的内容。

有人遇到过这个问题吗?看来这是异步范例没有干净解决方案的情况。

编辑:问题#2,是否有一种无需递归即可做到这一点的方法?递归对于小例子来说很好,但现在我有一个 stackoverflow 案例,它可以在没有警告的情况下终止程序(并耗尽内存)。

最佳答案

递归是实现此目的的方法。

首先,提取一个函数来检索单个页面:

function requestPage(stringToGetToNextPage, callback) {
request({
url: 'http://website.com',
qs: {
nextPage: stringToGetToNextPage
}
}, function(err, res, body) {
if (err) { callback(err); }
else { callback(null, JSON.parse(body)); }
});
}

然后,创建一个可以递归调用自身的函数来获取每个连续的页面:

function requestAllPages(stringToGetToNextPage, callback) {
requestPage(stringToGetToNextPage, function (err, page) {
if (err) { callback(err); }
else if (page && page.stringToGetToNextPage) {
requestAllPages(page.stringToGetToNextPage, callback);
}
else { callback(); }
});
}

然后开始一切:

requestAllPages(null, function () {
console.log('Done!');
});
<小时/>

编辑如果您确实想要对特定数量的页面进行分页而不是翻到最后,则可以通过对 requestAllPages 进行小修改来实现:

function requestPages(numPages, stringToGetToNextPage, callback) {
if (numPages <= 0) { callback(); return; }

requestPage(stringToGetToNextPage, function (err, page) {
if (err) { callback(err); }
else if (page && page.stringToGetToNextPage) {
requestPages(numPages - 1, page.stringToGetToNextPage, callback);
}
else { callback(); }
});
}

requestPages(20, null, function () {
console.log('Done!');
});

关于javascript - 调用数量可变且相互依赖的异步函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43818195/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com