Javascript 调用相互依赖的可变数量的异步函数
我试图通过一个网站分页,在那里为了请求下一页,当前页面上的信息是必需的Javascript 调用相互依赖的可变数量的异步函数,javascript,node.js,asynchronous,callback,Javascript,Node.js,Asynchronous,Callback,我试图通过一个网站分页,在那里为了请求下一页,当前页面上的信息是必需的 function paginateSite(numPages, cb) { var stringToGetToNextPage = '' for (var i = 0; i < numPages; i++) { (function(i, stringToGetToNextPage) { request({ url: 'http://
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)
}
}
功能分页站点(numPages,cb){
变量stringToGetToNextPage=''
对于(变量i=0;i
正如您所见,我无法在匿名函数之外设置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!');
});
函数请求页(numPages、stringToGetToNextPage、回调){
if(numPages递归是实现这一点的方法
首先,提取一个函数来检索单个页面:
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!');
});
函数请求页(numPages、stringToGetToNextPage、回调){
如果(numPages写一个递归函数
function get_page(next_page_number, last_page_number, string_needed, callback) {
request(
{
url: 'http://website.com',
qs: {
nextPage: string_needed
}
},
function(err, res, body) {
// NB: Bad variable name. `body` is JSON. `body_json` won't be.
var body_json = JSON.parse(body);
if (next_page_number == last_page_number) {
callback(body_json);
} else {
get_page(
next_page_number + 1,
last_page_number,
body_json.stringToGetToNextPage,
callback
);
}
}
);
}
get_page(1, 27, "", function (body_json) { console.log(body_json); });
编写一个递归函数
function get_page(next_page_number, last_page_number, string_needed, callback) {
request(
{
url: 'http://website.com',
qs: {
nextPage: string_needed
}
},
function(err, res, body) {
// NB: Bad variable name. `body` is JSON. `body_json` won't be.
var body_json = JSON.parse(body);
if (next_page_number == last_page_number) {
callback(body_json);
} else {
get_page(
next_page_number + 1,
last_page_number,
body_json.stringToGetToNextPage,
callback
);
}
}
);
}
get_page(1, 27, "", function (body_json) { console.log(body_json); });
有没有一种方法可以在没有递归的情况下做到这一点?(参见编辑)有没有一种方法可以在没有递归的情况下做到这一点?(参见编辑)有没有一种方法可以在没有递归的情况下做到这一点?(参见编辑)@JacksonDarrow我想不出一种没有递归的方法来实现这一点,但是你对堆栈溢出和内存过度使用的担心是没有根据的。因为调用是异步的,它们不会共享同一个堆栈,而且我的代码编写方式是,在任何给定时间内存中每个函数最多应该有一个调用。是吗有没有一种不用递归就能做到这一点的方法?(参见编辑)@JacksonDarrow我想不出一种没有递归的方法来实现这一点,但是你对堆栈溢出和内存过度使用的担心是没有根据的。因为调用是异步的,它们不会共享同一个堆栈,而且我的代码编写方式是,在任何给定的时间,内存中每个函数最多应该有一个调用。