javascript 回调只是作为函数调用中的参数发送的匿名函数吗?

Yet*_*ene 3 javascript

Javascript callbacks匿名函数是否只是作为函数调用中的参数发送?

例如,

mySandwich('ham', 'cheese', function() {  
   alert('Finished eating my sandwich.');  
  }); 
Run Code Online (Sandbox Code Playgroud)

Mat*_*sch 6

JavaScript 回调是作为值传递给异步函数的函数,目的是继续执行。

函数是值:

因此,在 JavaScript 中,您可以传递类似值的函数。您可以通过多种方式引用函数:

  1. 传递一个文字匿名函数作为回调

    doSomeWork(function (err, result) {
        if (err) {
            throw new Error(err);
        } else {
            console.log(result);
        }
    });
    
    Run Code Online (Sandbox Code Playgroud)
  2. 传递一个文字命名函数作为回调

    doSomeWork(function magicalCallback(err, result) {
        if (err) {
            throw new Error(err);
        } else {
            console.log(result);
        }
    });
    
    Run Code Online (Sandbox Code Playgroud)

    命名每个函数是一个聪明的主意,因为您可以在堆栈跟踪中看到它

  3. 传入一个变量的值,该变量恰好将函数存储为回调

    var someFunction = function callItWhatYouWant(err, result) {
        if (err) {
            throw new Error(err);
        } else {
            console.log(result);
        }
    }
    
    // reference the callback stored in the someFunction variable
    doSomeWork(someFunction);
    
    Run Code Online (Sandbox Code Playgroud)
  4. 通过引用函数名作为回调传入函数

    function callItWhatYouWant(err, result) {
        if (err) {
            throw new Error(err);
        } else {
            console.log(result);
        }
    }
    
    // reference the callback function using the function name
    doSomeWork(callItWhatYouWant);
    
    Run Code Online (Sandbox Code Playgroud)

继续?

继续就是下一步。当你调用一个异步函数时,它需要通知你它已经完成。回调作为下一步,即异步函数将在完成后回调您。

所以回调只是一个用于特定目的的函数参数,即延续。

回调签名

回调应该采用哪些参数没有标准,但在 Node.js 社区中,我们采用了通用签名

function (err, result)
Run Code Online (Sandbox Code Playgroud)

这里err是一个Error对象,如果东西坏事情,或者null如果事情是成功的。如果事情变坏了result一般是undefined,否则它包含结果。所以你的回调通常由任何一个调用

callback(new Error("oops"));
Run Code Online (Sandbox Code Playgroud)

或者

callback(null, result);
Run Code Online (Sandbox Code Playgroud)

另请注意,异步函数的最后一个参数作为回调参数是正常的

function callLater(delay, args, callback) {
    setTimeout(function () {     
        callback(null, args);
    }, delay);
}
Run Code Online (Sandbox Code Playgroud)