[英]Node.js + request + for loop : Runs twice
我使用cheerio和請求客戶端創建了一個簡單的刮板,但它不能按我想要的方式工作。
首先我在終端上看到所有“返回空值,什么都不做”的消息,然后看到名稱,所以我認為它首先檢查所有返回空值的 url,然后是非空值。
我希望它以正確的順序運行,從 1 到 100。
app.get('/back', function (req, res) {
for (var y = 1; y < 100; y++) {
(function () {
var url = "example.com/person/" + y +;
var options2 = {
url: url,
headers: {
'User-Agent': req.headers['user-agent'],
'Content-Type': 'application/json; charset=utf-8'
}
};
request(options2, function (err, resp, body) {
if (err) {
console.log(err);
} else {
if ($ = cheerio.load(body)) {
var links = $('#container');
var name = links.find('span[itemprop="name"]').html(); // name
if (name == null) {
console.log("null returned, do nothing");
} else {
name = entities.decodeHTML(name);
console.log(name);
}
}
else {
console.log("can't open");
}
}
});
}());
}
});
如果您不使用 promise 並且希望按順序運行請求,那么這是運行順序異步循環的常見設計模式:
app.get('/back', function (req, res) {
var cntr = 1;
function next() {
if (cntr < 100) {
var url = "example.com/person/" + cntr++;
var options2 = {
url: url,
headers: {
'User-Agent': req.headers['user-agent'],
'Content-Type': 'application/json; charset=utf-8'
}
};
request(options2, function (err, resp, body) {
if (err) {
console.log(err);
} else {
if ($ = cheerio.load(body)) {
var links = $('#container');
var name = links.find('span[itemprop="name"]').html(); // name
if (name == null) {
console.log("null returned, do nothing");
} else {
name = entities.decodeHTML(name);
console.log(name);
}
} else {
console.log("can't open");
}
// do the next iteration
next();
}
});
}
}
// start the first iteration
next();
});
如果您想並行發出所有請求(同時進行多個請求),這將是更快的最終結果,然后在最后按順序累積所有結果,您可以這樣做:
// create promisified version of request()
function requestPromise(options) {
return new Promise(function(resolve, reject) {
request(options2, function (err, resp, body) {
if (err) return reject(err);
resolve(body);
});
});
}
app.get('/back', function (req, res) {
var promises = [];
var headers = {
'User-Agent': req.headers['user-agent'],
'Content-Type': 'application/json; charset=utf-8'
};
for (var i = 1; i < 100; i++) {
promises.push(requestPromise({url: "example.com/person/" + i, headers: headers}));
}
Promise.all(promises).then(function(data) {
// iterate through all the data here
for (var i = 0; i < data.length; i++) {
if ($ = cheerio.load(data[i])) {
var links = $('#container');
var name = links.find('span[itemprop="name"]').html(); // name
if (name == null) {
console.log("null returned, do nothing");
} else {
name = entities.decodeHTML(name);
console.log(name);
}
} else {
console.log("can't open");
}
}
}, function(err) {
// error occurred here
});
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.