我创建使用cheerio,并要求客户一个简单的刮刀,但它不工作我想要的方式。for循环的Node.js +请求:运行两次
首先,我看到所有的“空回来,什么都不做”终端上的消息,然后看到的名称,所以我觉得它首先会检查所有返回null,则非空的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");
}
}
});
}());
}
});
什么是 “正确的秩序”? – Houseman
@Houseman从1到100 – salep
你的循环不会等待第一个请求到第二个触发之前返回。 Javascript是异步的。有很多技术可以让你等待。 [例如](https://zackehh.com/handling-synchronous-asynchronous-loops-javascriptnode-js/)。或者你可以使用像[Q]这样的库(https://github.com/kriskowal/q)。 [此外,这种(http://stackoverflow.com/questions/15162049/javascript-synchronizing-foreach-loop-with-callbacks-inside) – Houseman