【问题标题】:Javascript callback not getting invokedJavascript回调没有被调用
【发布时间】:2018-10-23 06:03:13
【问题描述】:

我正在尝试运行这个 sn-p,但它似乎没有执行回调。我试图了解发生了什么。

  function exampleSimpleTask(done) {
    console.log("task", "Before "+new Date().getTime());
    setTimeout(() => done, 2000);
  }

 function demo() {
   alert("Demo Executed");
 }

 exampleSimpleTask(demo); // it doesn't do anything.
 //  exampleSimpleTask.call(null, demo);
 // exampleSimpleTask.call(null, demo.bind(this)); 

我不确定为什么要执行回调,我怀疑它与箭头函数有关。如果=>function() 替换会怎样?

【问题讨论】:

  • 在你的函数 exampleSimpleTask 中你永远不会调用函数done

标签: javascript callback


【解决方案1】:

您忘记在 lambda 表达式中调用 done() 函数。下面的代码应该可以工作:

  function exampleSimpleTask(done) {
    console.log("task", "Before "+new Date().getTime());
    setTimeout(() => done(), 2000);
  }

 function demo() {
   alert("Demo Executed");
 }

 exampleSimpleTask(demo); // it doesn't do anything.
 //  exampleSimpleTask.call(null, demo);
 // exampleSimpleTask.call(null, demo.bind(this)); 

【讨论】:

    【解决方案2】:

    您忘记为调用 demo 方法添加括号:

    function exampleSimpleTask(done)
    {
        console.log("task", "Before "+new Date().getTime());
        setTimeout(() => done(), 2000);
    }
    
    function demo()
    {
        alert("Demo Executed");
    }
    
    exampleSimpleTask(demo); // it doesn't do anything.

    作为替代方案,您可以简单地将方法的名称放在 setTimeout() 函数上,如下所示:

    function exampleSimpleTask(done)
    {
        console.log("task", "Before " + new Date().getTime());
        setTimeout(done, 2000);
    }
    
    function demo()
    {
        alert("Demo Executed");
    }
    
    exampleSimpleTask(demo); // it doesn't do anything.

    【讨论】:

      【解决方案3】:

      setTimeout 中不需要箭头函数。 setTimeout() 的第一个参数是到了时间要执行的函数,done 包含对该函数的引用,所以直接传递即可。

        function exampleSimpleTask(done) {
          console.log("task", "Before "+new Date().getTime());
          setTimeout(done, 2000);
        }
      
       function demo() {
         alert("Demo Executed");
       }
      
       exampleSimpleTask(demo); // it doesn't do anything.
       //  exampleSimpleTask.call(null, demo);
       // exampleSimpleTask.call(null, demo.bind(this)); 

      【讨论】:

      • 那么您可能会更清楚地了解我的实际问题。我很好奇这是如何工作的? jsfiddle.net/w1xLvzef 我已经从我最初试图解决的这个任务运行程序问题中提取了一些片段。
      • 我解释了它是如何工作的。 done 包含对该函数的引用。 setTimeout 在超时时调用该函数。
      • 知道了。谢谢你的时间。
      【解决方案4】:

      在你的函数 exampleSimpleTask 中,你永远不会调用函数 done

      function exampleSimpleTask(done) {
        console.log("task", "Before "+new Date().getTime());
        setTimeout(() => done(), 2000);
      }
      

      function exampleSimpleTask(done) {
          console.log("task", "Before "+new Date().getTime());
          setTimeout(() => done(), 2000);
        }
      
       function demo() {
         alert("Demo Executed");
       }
      
       exampleSimpleTask(demo); 

      【讨论】:

      • 那么这是如何工作的呢? jsfiddle.net/w1xLvzef我已经从这个任务运行器问题中提取了点点滴滴。
      • @TechnoCorner 当您传递参数时,会立即调用一个函数。所有正在工作的人都因此而工作。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-26
      • 2013-04-25
      • 1970-01-01
      相关资源
      最近更新 更多