【问题标题】:How to pass a callback as a parameter into another function如何将回调作为参数传递给另一个函数
【发布时间】:2011-09-21 21:39:26
【问题描述】:

我是 ajax 和回调函数的新手,如果我的概念完全错误,请原谅我。

问题:我可以将 callbackfunction 作为参数发送给另一个将执行回调的函数吗?

function firstFunction(){
    //some code

    //a callback function is written for $.post() to execute
    secondFunction("var1","var2",callbackfunction);
}

function secondFunction(var1, var2, callbackfunction) {
    params={}
    if (event != null) params = event + '&' + $(form).serialize();

    // $.post() will execute the callback function
    $.post(form.action,params, callbackfunction);
}

【问题讨论】:

标签: javascript ajax callback call


【解决方案1】:

是的。函数引用就像任何其他对象引用一样,您可以随心所欲地传递它们。

这是一个更具体的例子:

function foo() {
    console.log("Hello from foo!");
}

function caller(f) {
    // Call the given function
    f();
}

function indirectCaller(f) {
    // Call `caller`, who will in turn call `f`
    caller(f);
}

// Do it
indirectCaller(foo); // logs "Hello from foo!"

您也可以为foo 传递参数:

function foo(a, b) {
    console.log(a + " + " + b + " = " + (a + b));
}

function caller(f, v1, v2) {
    // Call the given function
    f(v1, v2);
}

function indirectCaller(f, v1, v2) {
    // Call `caller`, who will in turn call `f`
    caller(f, v1, v2);
}

// Do it
indirectCaller(foo, 1, 2); // logs "1 + 2 = 3"

【讨论】:

    【解决方案2】:

    另外,可以简单如下:

    if( typeof foo == "function" )
        foo();
    

    【讨论】:

      【解决方案3】:

      如果你用谷歌搜索javascript callback function example,你会得到Getting a better understanding of callback functions in JavaScript

      这是如何做一个回调函数:

      function f() {
          alert('f was called!');
      }
      
      function callFunction(func) {
          func();
      }
      
      callFunction(f);
      

      【讨论】:

        【解决方案4】:

        是的,当然,函数是对象,可以传递,当然你必须声明它:

        function firstFunction(){
            //some code
            var callbackfunction = function(data){
               //do something with the data returned from the ajax request
             }
            //a callback function is written for $.post() to execute
            secondFunction("var1","var2",callbackfunction);
        }
        

        有趣的是,您的回调函数还可以访问您可能在 firstFunction() 中声明的每个变量(javascript 中的变量具有本地范围)。

        【讨论】:

          【解决方案5】:

          CoffeeScript 的示例:

          test = (str, callback) ->
            data = "Input values"
            $.ajax
              type: "post"
              url: "http://www.mydomain.com/ajaxscript"
              data: data
              success: callback
          
          test (data, textStatus, xhr) ->
            alert data + "\t" + textStatus
          

          【讨论】:

          • -> 在 javascript 中是什么意思?@nothing-special-here
          • -> 只是一个普通函数。 var test = function(str, callback) { ajax call }
          • @shenkwen 细箭头 -> 是 CoffeeScript 语法,而不是 JavaScript,仅表示编译成 JavaScript 时的普通 JavaScript 函数。 JavaScript 也有类似的箭头函数w3schools.com/Js/js_arrow_function.asp
          【解决方案6】:

          你可以像这样使用 JavaScript CallBak:

          var a;
          
          function function1(callback) {
           console.log("First comeplete");
           a = "Some value";
           callback();
          }
          function function2(){
           console.log("Second comeplete:", a);
          }
          
          
          function1(function2);
          

          或 Java Script Promise:

          let promise = new Promise(function(resolve, reject) { 
            // do function1 job
            let a = "Your assign value"
            resolve(a);
          });
          
          promise.then(             
          
          function(a) {
           // do function2 job with function1 return value;
           console.log("Second comeplete:", a);
          },
          function(error) { 
           console.log("Error found");
          });
          

          【讨论】:

            猜你喜欢
            • 2021-04-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-08-19
            • 1970-01-01
            • 2023-01-12
            • 2013-04-13
            • 2017-08-07
            相关资源
            最近更新 更多