【问题标题】:Is there any advantage to using a callback function here (JavaScript)?在这里使用回调函数(JavaScript)有什么好处吗?
【发布时间】:2016-04-29 19:24:57
【问题描述】:

出于某种原因,我无法理解 JS 中的回调函数。我认为它终于点击了如何使用它们(排序),但我仍然无法弄清楚为什么我需要。这两段代码有何不同,为什么使用回调版本会更好?他们都做同样的事情。它们都消除了重复代码的需要。它们的文件大小差不多。对我来说,为什么我会在第一个例子中使用回调示例并不明显 - 至少如果目标是防止重复代码(这就是我读到的使用这样的回调的原因)。

版本 1

    // no need to pass a function -- not a callback
    function addNumsAndMultiply(num1, num2) {
        findSum(num1, num2);
        var product = num1 * num2;
        alert("The product of " + num1 + " and " + num2 + " is: " + product);
    }

    function addNumsAndDivide(num1, num2) {
        findSum(num1, num2);
        var quotient = num1 / num2;
        alert("The quotient of " + num1 + "/" + num2 + " is: " + quotient);
    }

    function findSum(num1, num2) {
        var sum = num1 + num2;
        alert("The sum of " + num1 + " and " + num2 + " is: " + sum);
    }

    addNumsAndMultiply(3,4);
    addNumsAndDivide(30,5);

第 2 版

    // passed the function -- this is a callback
    function addNumsAndWhat(num1, num2, callback) {
        var sum = num1 + num2;
        alert("The sum of " + num1 + " and " + num2 + " is: " + sum);
        callback(num1,num2);
    }

    function multiply(num1, num2) {
        var product = num1 * num2;
        alert("The product of " + num1 + " and " + num2 + " is: " + product);
    }

    function divide(num1, num2) {
        var quotient = num1 / num2;
        alert("The quotient of " + num1 + "/" + num2 + " is: " + quotient);
    }

    addNumsAndWhat(3,4,multiply);
    addNumsAndWhat(30,5,divide);

【问题讨论】:

  • 回调在这里没用,但如果addNumsAndWhat 异步执行一堆事情(例如,与 Web 服务器对话),它会很有用。当 Web 服务器响应时,addNumsAndWhat 可以使用回调告诉它“抱歉,花了这么长时间,但这是您问题的答案。”
  • 我部分不同意雷蒙德的观点。回调函数不仅在处理异步任务时很有用,它也是实现策略化设计模式的最简单方法。这是一种消除代码重复的方法。
  • @RaymondChen 虽然回调主要用于处理异步,但这并不是它的唯一用途。
  • 我并不是说异步是回调的唯一用途;我只是举了一个例子,说明回调如何在执行计算并产生单个结果的上下文中变得有用。但我想我们都同意,在这种情况下,回调没有用。

标签: javascript function parameters callback arguments


【解决方案1】:

你做的回调是正确的,但你在哪里使用它们并没有什么意义。

Javascript 回调最大的优势在于异步操作——例如进行网络调用。下面是一些示例代码:

http://www.w3schools.com/ajax/tryit.asp?filename=tryajax_first

这很简单——你开始调用并给它一个函数,当它完成时调用它。无需轮询或执行任何其他同步操作,您只需等待完成、失败等通知。

【讨论】:

    【解决方案2】:

    在您的场景中使用回调函数的主要好处是抽象和模块化。

    功能:

    addNumsAndWhat();
    

    允许你给它两个数字,将它们相加,然后使用回调函数以某种方式操作它们,其中函数:

    addNumsAndMultiply();
    addNumsAndDivide();
    

    他们的工作非常具体。

    总而言之,以目前的方式使用回调并没有任何真正的好处,除非您关心使用该回调的小额奖励模块化。

    【讨论】:

      【解决方案3】:

      使用回调方法有一个小好处,虽然在 this 中使用它可能是矫枉过正:

      / 传递函数 -- 这是一个回调 函数 addNumsAndWhat(num1, num2, 回调) { var sum = num1 + num2; alert(""+num1+"和"+num2+"之和为:"+sum); 回调(num1,num2); }

      function multiply(num1, num2) {
          var product = num1 * num2;
          alert("The product of " + num1 + " and " + num2 + " is: " + product);
      }
      
      function divide(num1, num2) {
          var quotient = num1 / num2;
          alert("The quotient of " + num1 + "/" + num2 + " is: " + quotient);
      }
      
      addNumsAndWhat(3,4,multiply);
      addNumsAndWhat(30,5,divide);
      

      你可以这样说:

      task = {
        multiply: multiply,
        divide: divide
      };
      
      addNumsAndWhat(4, 5, task['divide']);
      

      因此允许传递字符串参数,可能来自配置对象或业务/游戏规则引擎。

      【讨论】:

        【解决方案4】:

        在您提供的示例中,使用回调并没有真正发挥其用处。事实上,即使您调用作为参数“回调”传递的函数,它也不会让人感觉如此。真正的回调函数通常是调用者需要知道某个函数的结果的函数,这可能是也可能不是异步操作。

        Js Fiddle example

        代码:

        // Asynchronous operation to fetch json
        function fetchJSON(cb) {
          setTimeout(function() {
            // When the work is done, we notify the caller
            cb({ name: "maunovaha", age: 29 }, null); 
          }, 1000);
        }
        
        // Asynchronous call
        fetchJSON(function(data, error) {
          if (error) {
            console.log("Error occurred while fetching JSON: " + error);
            return;
          }
          // Do something with the data
          console.log(data);
        });
        

        所以简而言之,上面的例子使用了类似的node.js数据/错误处理格式。回调也可以返回错误而不是数据,并将相应地显示。希望这会有所帮助。

        【讨论】:

          猜你喜欢
          • 2010-12-04
          • 2010-10-14
          • 1970-01-01
          • 2014-08-27
          • 1970-01-01
          • 1970-01-01
          • 2020-08-27
          • 2011-04-24
          • 1970-01-01
          相关资源
          最近更新 更多