节点教程 – LearnYouNode – 杂耍asynchronous – 使用嵌套的callback

我试图从nodechool.io的“learnyounode”工作室解决“杂耍asynchronous”问题。 我在这里看到了很多关于这个问题的问题,因为URL是从一个循环中调用的。 我明白为什么这是行不通的。 我曾尝试过这样的事情。

var http=require('http'); console.log(process.argv[2],process.argv[3],process.argv[4]); fn(process.argv[2], fn(process.argv[3], fn(process.argv[4]))); function fn(url,callback){ http.get(url,function(response){ var string=''; response.setEncoding('utf8'); response.on('data',function(data){ string+=data; }); response.on('end',function(){ console.log(url,string); if (callback) { callback(); } }); }); }; 

根据我的理解,第二个GET调用只有在第一个调用结束后才会出现,因为它在响应结束后才启动。 但是输出总是以不同的顺序。

我看到了正确的解决scheme。 我知道这样做不能利用asynchronous的优势,但不应该使callback按顺序输出?

当你传入一个函数作为callback时,你只需要传入函数名或函数定义。 通过提供参数,你实际上正在调用这个函数。

例如,假设您有一个函数f1将另一个函数作为参数,并将另一个函数f2传递给f1:

 function f1(func_param) { console.log('Executing f1!'); } function f2(a_param) { console.log('Executing f2!'); } 

当你做下面的调用时(与你正在做的类似,提供一个callback函数并为callback指定参数):

 f1(f2(process.argv[2])); 

你首先评估f2,所以'执行f2!' 将首先打印。 f2的返回值将作为parameter passing给f1,它将执行并打印'执行f1!'

在你的电话里

 fn(process.argv[2], fn(process.argv[3], fn(process.argv[4]))); 

您在说,让我们将fn(process.argv [4])的结果作为callback函数传递给fn(process.argv [3]),我们将得到调用该结果并将其作为callback函数传递给fn (process.argv [2])。