[英]How to loop in node js, wait until each iteration
我有一個功能:
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);
};
};
問題是當我執行上述操作時,我僅在console.log(AllLinks)
獲得第一個循環元素(i=0)
的結果。 如何正確在節點中循環? 我是Node的新手,因此非常感謝任何評論!
編輯:如果我在request
定義AllLinks
似乎工作,但不正確的順序...
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”外)是,假設請求執行異步操作,則當請求未完成時函數將返回,因此日志不包含任何更新。
您通常有兩種策略:
因此,您需要:
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);
});
使用async.js #eachSeries將異步函數應用於集合的每個元素
您的問題是您在循環內使用return 。 如果您僅使用IIFE
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);
};
};
AllLinks
將正確生成。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.