为什么我的asynchronouscallback函数没有按顺序返回数据请求?

我正在学习Node.js,并且正在通过Node学校的Learnyounode课程工作,虽然这是一个相当大的挑战,但我有点困惑…

我被卡住的问题是Excercise 9-杂耍asynchronous…

我试图解决这个问题:

“您必须收集每个URL提供给您的完整内容并将其打印到控制台(stdout)。您不需要输出长度,只需将数据作为string打印;每个URL一行。是你必须按照与提供给你的命令行参数相同的顺序打印出来。“

我试着在一个名为“waiting”的variables中计算callback,然后在计算3个callback函数时调用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]); } } 

asynchronouscallback不能保证按照HTTP请求的顺序发生。

您可以通过更改来维护订单:

 output.push(data.toString()); 

至:

 output[i] = data.toString(); 

这是因为你的http get请求是asynchronous的。

而不是推到输出数组这样做

 output[i]=data.toString(); 

通过closures或将其作为属性添加到请求,保存每个请求的“i”索引的值。 然后,您可以使用该索引来订购您的回应。