我正在学习 Node.js 并且正在学习 Node 学校的 Learnyounode 类(class),这很棒,尽管它是一个相当大的挑战而且我有点困惑......
我遇到的问题是练习 9-杂耍异步...
我正在尝试解决问题:
“您必须收集每个 URL 提供给您的完整内容,并将其打印到控制台(stdout)。您不需要打印出长度,只需将数据作为字符串;每个 URL 一行。问题是您必须按照与作为命令行参数提供给您的 URL 相同的顺序打印它们。”
我已经尝试在一个名为“waiting”的变量中计算回调数,然后在计算到 3 个回调时调用 complete()
函数,但数据仍然总是以错误的顺序返回我不知道为什么....
var http = require('http');
var bl = require('bl');
var url = []
url[0] = process.argv[2];
url[1] = process.argv[3];
url[2] = process.argv[4];
var waiting = 0;
for(i=0; i < url.length; i++) {
var output = [];
http.get( url[i], function(res) {
res.setEncoding('utf8');
res.pipe(bl(function(err,data) {
output.push(data.toString());
waiting++;
if(waiting == 3) {
complete(output);
}
}));
});
}
var complete = function(output) {
for(i=0; i < output.length; i++) {
console.log(output[i]);
}
}
最佳答案
异步回调不保证按照 HTTP 请求的顺序发生。
您可以通过更改来维持顺序:
output.push(data.toString());
到:
output[i] = data.toString();
关于javascript - 为什么我的异步回调函数没有按顺序返回数据请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30979122/