Javascript - 回调的优势

时间:2017-01-19 15:35:34

标签: javascript node.js callback

我对回调的理解有点问题。我在过去的两天里看了很多,我理解的是以下内容(纠正我,如果我错了):

JavaScript是单线程语言,您可以编程同步和异步。 同步意味着,每个语句在执行之前等待前一个语句完成。这可能会导致麻烦,因为如果例如与数据库的连接需要很多时间,那么之前的语句必须等待。 最后这非常糟糕,这就是为什么在Javascript中编程异步更好的原因,因为异步代码不必等待,代码可以继续运行而用户不必等待。

要进行异步编程,需要使用Callbacks(更高阶的函数)。

现在我尝试用很多教程等编写一个小例子。

function testCallback(a,callback){
    console.log('1.function and given parameter: '+a);
    callback(10);
}    

testCallback(5 , function(x){
    console.log("2.function and given parameter of 1. function: "+x);
});

是吗?输出是:

1.function and given parameter: 5
2.function and given parameter of 1. function: 10

我不明白,这段代码的优点是什么,因为我认为仍然会导致麻烦?如果“console.log('1.function和....')有问题,回调(10)函数甚至会停止吗?

感谢您的帮助!

3 个答案:

答案 0 :(得分:4)

  

JavaScript是单线程语言......

不,不是。该语言没有提及线程。但是,大多数环境为每个全局环境提供单个线程(在浏览器上,您可以创建更多,通过消息传递进行互操作)。 NodeJS只提供一个线程。某些环境(例如JDK上的Rhino或Nashorn)提供真正的多线程(以及可能涉及的所有优点和麻烦)。

使用回调不会使代码异步。例如,您的示例不是异步的。考虑:

function testCallback(a,callback){
    console.log('1.function and given parameter: '+a);
    callback(10);
}    

console.log("Before the call");
testCallback(5 , function(x){
    console.log("2.function and given parameter of 1. function: "+x);
});
console.log("After the call");

请注意,我们在 After the call之后才看到2.function and given parameter of 1. function: 10。如果回调是异步的,我们之前会看到它:

function testCallback(a,callback){
    console.log('1.function and given parameter: '+a);
    setTimeout(function() { // Using setTimeout
      callback(10);         // to make this call
    }, 0);                  // asynchronous
}    

console.log("Before the call");
testCallback(5 , function(x){
    console.log("2.function and given parameter of 1. function: "+x);
});
console.log("After the call");

是同步调用还是异步调用回调完全取决于您传递的函数的作用。例如,Array#sort使用的回调是同步调用的,但setTimeout使用的回调是异步调用的。

对于要异步的代码,它必须启动一个操作,然后让该操作完成以后,从而触发回调。 setTimeout就是这样做的,正确使用时也是如此,与其他各种事情一样。

请注意,回调当前是处理异步行为的方式(如上所述的简单回调,或promise回调),但下一个规范(ES2017)将定义built-in language semantics来处理异步,而不需要回调asyncawait的形式。如果您使用像Babel这样的工具进行转换,那么今天就可以使用该语法。

答案 1 :(得分:2)

在javascript中,回调可以是同步的,也可以是异步的。同步回调可以带来很多好处,但它们不会阻止代码阻塞。

我认为理解异步代码是什么以及为什么它有益的最好方法是了解Javascript如何实际评估代码。我推荐这个视频,它非常清楚地解释了这个过程https://www.youtube.com/watch?v=8aGhZQkoFbQ

答案 2 :(得分:0)

JavaScript Callback Function是一个作为参数传递给另一个JavaScript函数的函数。回调可以是同步的也可以是异步的。简单地将函数作为参数传递不会改变其当前行为。

它的行为可以通过在事件监听器或setTimeout函数内调用它来执行它的方法来改变。基本上事件监听器或setTimeout等由webapi以异步方式处理。如果回调函数在这些函数内部,则当它们被激活时会被webapi移动到队列,如按钮单击(事件监听器)或在setTimeout中声明的时间传递。它们将从队列移动到堆栈(如果堆栈为空)并最终在堆栈上运行。

使用回调函数的主要优点可以从下面的代码中看到: -

var add = function(x,y) {
    return x+y;
}

var multiply = function(x,y){
    return x*y;
}

var calculate = function(x,y,callback){
    return callback(x,y);
}

console.log(calculate(4,9,add));