我试图通过nodeschool.io解决“learnyounode”研讨会中的“杂耍异步”问题。我在这里看到了很多关于这个问题的问题,因为它是从循环中调用的。我明白为什么那不起作用。 我曾经尝试过这样的事情。
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调用应该在第一个GET调用结束后才会出现,因为它是在响应结束后启动的。但输出总是按不同的顺序排列。
我已经看到了正确的解决方案。我知道这样做是不能利用异步的优势,但回调不应该按顺序输出吗?
答案 0 :(得分:3)
当您将函数作为回调传入时,您只需要传入函数名称或函数定义。通过提供参数,您实际上是在调用函数。
E.g。让我们说你有一个函数f1,它接受另一个函数作为参数,另一个函数f2你要传递给f1:
function f1(func_param) {
console.log('Executing f1!');
}
function f2(a_param) {
console.log('Executing f2!');
}
当您执行以下调用时(类似于您正在执行的操作,提供回调函数并指定回调参数):
f1(f2(process.argv[2]));
您首先评估f2,所以'执行f2!'将先打印。 f2的返回将作为参数传递给f1,f1将执行并打印执行f1!'
在你的电话中
fn(process.argv[2],
fn(process.argv[3],
fn(process.argv[4])));
你说,让fn(process.argv [4])的结果作为fn(process.argv [3])的回调传递,我们得到调用的结果并将其作为回调传递给fn(process.argv [2])。