【发布时间】:2016-02-04 01:40:36
【问题描述】:
我正在使用 Cheerio、request 和 Node.js。
当我运行下面的脚本时,它以错误的顺序输出名称。我相信它是由它的异步性质引起的,我怎样才能让它以“正确”的顺序工作?我是否需要使用同步包,或者有没有办法以某种方式对其进行更改,使其能够以同步方式工作?
app.get('/returned', function (req, res) {
for (var y = 0; y < 10; y++) {
var url = "http://example.com" + y + "/person.html";
request(url, function (err, resp, body) {
$ = cheerio.load(body);
var links = $('#container');
var name = links.find('span[itemprop="name"]').html(); // name
if (name == null) {
console.log("returned null");
} else {
console.log(name);
}
});
}
});
【问题讨论】:
-
视情况而定。您想并行还是串行发送请求。假设您请求的服务器一次可以处理超过 1 个请求,串联会比并联慢得多。可以并行处理它,同时仍然按照您想要的顺序获得结果。
-
并行。我认为 async 会完成这项工作(由@dm03514 回答),我会调查一下。
-
请注意,他的答案是串联的,而不是平行的。但是 async 确实有一个并行选项,您只需要以某种方式以您想要的顺序存储结果,而不管它们是否会被乱序调用。
-
一开始为什么要用app.get?我正在尝试从这个示例中做一些非常相似的工作,但我真的被卡住了!已阅读请求 github 文档,但没有帮助。