节点教程 - LearnYouNode - Juggling Async - 使用嵌套回调

时间:2015-08-05 17:01:22

标签: node.js asynchronous

我试图通过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调用结束后才会出现,因为它是在响应结束后启动的。但输出总是按不同的顺序排列。

我已经看到了正确的解决方案。我知道这样做是不能利用异步的优势,但回调不应该按顺序输出吗?

1 个答案:

答案 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])。