我有一个功能:
var third = function(classes){
for (var i = 0; i <= (classes.length-1); i++) {
var Myurl = classes[i];
return function(Myurl){
request(Myurl, function(err, resp, body) {
if (!err && resp.statusCode == 200) {
var $ = cheerio.load(body);
$("#item_details dl").each(function() {
var Values = [];
var New = [];
Values=$(this).find("dd strong").text();
New = Values.replace(/[\n\t\r]/g,"");
AllLinks.push(New);
});
console.log(AllLinks);
};
})
}(MyUrl);
};
};
问题是当我执行上述操作时,我只得到
(i=0)
中第一个循环元素console.log(AllLinks)
的结果。如何正确在节点中循环?我是Node的新手,因此非常感谢任何评论!编辑:
如果我在
AllLinks
中定义request
,那么它似乎可以工作,但顺序不正确...var third = function(classes){
for (var i = 0; i <= (classes.length-1); i++) {
var Myurl = classes[i];
(function(Myurl){
request(Myurl, function(err, resp, body) {
if (!err && resp.statusCode == 200) {
var $ = cheerio.load(body);
AllLinks=[];
$("#item_details dl").each(function() {
var Values = [];
var New = [];
Values=$(this).find("dd strong").text();
New = Values.replace(/[\n\t\r]/g,"");
AllLinks.push(New);
});
console.log(AllLinks);
}(Myurl);
})
};
};
};
最佳答案
主要问题(除“ return”外)是,假设请求执行异步操作,则当请求未完成时函数将返回,因此日志不包含任何更新。
您通常有两种策略:
如上例所示,调用代码时不返回“ return”。这个案例
您所有的请求最终都会完成,但您无法控制
在什么时候。当您不需要它们全部进行时,它会很好地工作,
例如之后处理AllLinks
使用支持等待所有呼叫完成的任何技术(async.js或promises)。例如这里Simplest way to wait some asynchronous tasks complete, in Javascript?
因此,您需要:
function appendResultToItems(url, callback) {
request(url, function(err, resp, body) {
if (!err && resp.statusCode == 200) {
var $ = cheerio.load(body);
$("#item_details dl").each(function() {
var Values = [];
var New = [];
Values=$(this).find("dd strong").text();
New = Values.replace(/[\n\t\r]/g,"");
AllLinks.push({result:New, url: url});
callback();
});
});
}
var calls = [];
classes.forEach(function(Myurl){
calls.push(function(callback) {
appendResultToItems(Myurl, callback);
});
});
async.parallel(calls, function() {
console.log(AllLinks);
});