无法调用JavaScript回调

时间:2018-10-22 21:32:14

标签: javascript callback

我正在尝试运行此代码段,它似乎没有执行回调。我试图了解发生了什么。

  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()会怎样?

4 个答案:

答案 0 :(得分: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)); 

答案 1 :(得分:1)

您忘记为调用 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.

答案 2 :(得分:1)

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)); 

答案 3 :(得分:0)

在函数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);