我有一个功能:
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)
的结果。如何在节点中正确循环?我是节点的新手,所以任何评论都非常感谢!
编辑:
如果我在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);
})
};
};
};
答案 0 :(得分:4)
主要问题(除了'return')是假设请求执行异步操作,你的函数在请求未完成时返回,因此log不包含更新。
您通常有两种策略:
因此你需要:
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);
});
答案 1 :(得分:1)
使用async.js#eachSeries将异步函数应用于集合的每个元素
答案 2 :(得分:1)
您的问题是您在循环中使用返回。如果您只是使用IIFE
<script type="text/javascript">
$(document).ready(function() {
$(".show_other").change(function(){
if($(this).is(":checked"))
{
$("#other1").hide();
}
});
});
</script>
<form id="myform">
<div>Choose option:
<input type="radio" name="user_options" value="css" class="show_other" /> CSS
<input type="radio" name="user_options" value="jquery" /> jQuery
<input type="radio" name="user_options" value="html" /> HTML
<input type="radio" name="user_options" value="xml" /> XML
</div>
<div>Another option:
<input type="radio" name="user_site" value="Google" class="show_other" /> Google
<input type="radio" name="user_site" value="Yahoo" /> Yahoo
<input type="radio" name="user_site" value="Facebook" /> Facebook
<input type="radio" name="user_site" value="Twitter" /> Twitter
</div>
<div class="row" id="other1">
<textarea class="form-control" rows="4" id="specification" name="specification" placeholder="Enter Specification"></textarea>
</div>
</form>
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);
$("#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);
};
};
将正确生成。