Javascript,简单回调示例未按预期工作

Javascript,简单回调示例未按预期工作,javascript,callback,settimeout,Javascript,Callback,Settimeout,首先,非常感谢有人来看看我的问题。这是非常基本的,但我就是不明白。我已经看过了所有的教程,但是异步回调让我发疯。 非常感谢您的帮助,来自德国的问候:) 如果有人能告诉我为什么下面的代码没有像预期的那样登录到控制台。 预期的意思是,在超时函数完成后调用回调。 相反,我的控制台首先记录回调? 我在这里还犯了什么错 function doHomework(subject, callback) { setTimeout(function () { console.log(`Starting m

首先,非常感谢有人来看看我的问题。这是非常基本的,但我就是不明白。我已经看过了所有的教程,但是异步回调让我发疯。 非常感谢您的帮助,来自德国的问候:)

如果有人能告诉我为什么下面的代码没有像预期的那样登录到控制台。 预期的意思是,在超时函数完成后调用回调。 相反,我的控制台首先记录回调? 我在这里还犯了什么错

function doHomework(subject, callback) {
  setTimeout(function () {
   console.log(`Starting my ${subject} homework.`);
  }, 10);
  callback();
}

doHomework('math', function() {
  console.log('Finished my homework');
});

您需要将回调函数的调用放入
setTimeout

function doHomework(subject, callback) {
  setTimeout(function () {
   console.log(`Starting my ${subject} homework.`);
   callback();
  }, 10);
}

您需要将回调函数的调用放入
setTimeout

function doHomework(subject, callback) {
  setTimeout(function () {
   console.log(`Starting my ${subject} homework.`);
   callback();
  }, 10);
}

问题是您在
setTimeout
函数之外执行回调。Javascript异步执行代码,这意味着它不会等到上一个代码“完成”后再继续下一行

因此,当您调用
dohomography
时,它将启动计时器,并立即继续执行下一行代码,即回调。 然后,当10毫秒结束时,执行超时内的代码。 为了获得所需的结果,您必须将回调执行放在
setTimeout
函数中,如下所示:

function doHomework(subject, callback) {
   setTimeout(function () {
      console.log(`Starting my ${subject} homework.`);
      callback();
   }, 10);
}

问题是您在
setTimeout
函数之外执行回调。Javascript异步执行代码,这意味着它不会等到上一个代码“完成”后再继续下一行

因此,当您调用
dohomography
时,它将启动计时器,并立即继续执行下一行代码,即回调。 然后,当10毫秒结束时,执行超时内的代码。 为了获得所需的结果,您必须将回调执行放在
setTimeout
函数中,如下所示:

function doHomework(subject, callback) {
   setTimeout(function () {
      console.log(`Starting my ${subject} homework.`);
      callback();
   }, 10);
}

非常感谢德尔维安,感谢你快速准确的回答。虽然我理解你的观点,但我还是不完全理解。将回调放在超时内(根据定义,然后让回调在超时后触发)是有效的,但我认为回调总是确保某些东西是同步的。如果我的控制台日志需要更多的时间(以防在数据库中查找),我如何确保回调随后被触发,因为我不知道它是以毫秒为单位的。Sry,以防混淆。在{}中,某些东西是同步的?回调本身并不能使任何东西同步。回调只是一个可以传递给另一个函数并在其他地方运行的函数。如果是数据库查找,您只需将回调函数进一步传递给该查找函数,它将在该查找之后运行。恐怕不会。回调的意义在于,只有当您知道您已经设置了所需的前提条件时,才调用它们。事实上,传递给setTimeout的函数本身就是一个回调函数。例如,当您在执行函数之前需要来自Ajax调用的数据时,请确保在检索数据时将该函数作为回调函数执行。非常感谢你们两位@Delvian,你的最后一句话:如何确保在检索数据后以回调的形式执行函数。我是否手动设置超时?@Aliaksandr,var x=“lookUp some value”;回调();非常感谢德尔维安,感谢你快速准确的回答。虽然我理解你的观点,但我还是不完全理解。将回调放在超时内(根据定义,然后让回调在超时后触发)是有效的,但我认为回调总是确保某些东西是同步的。如果我的控制台日志需要更多的时间(以防在数据库中查找),我如何确保回调随后被触发,因为我不知道它是以毫秒为单位的。Sry,以防混淆。在{}中,某些东西是同步的?回调本身并不能使任何东西同步。回调只是一个可以传递给另一个函数并在其他地方运行的函数。如果是数据库查找,您只需将回调函数进一步传递给该查找函数,它将在该查找之后运行。恐怕不会。回调的意义在于,只有当您知道您已经设置了所需的前提条件时,才调用它们。事实上,传递给setTimeout的函数本身就是一个回调函数。例如,当您在执行函数之前需要来自Ajax调用的数据时,请确保在检索数据时将该函数作为回调函数执行。非常感谢你们两位@Delvian,你的最后一句话:如何确保在检索数据后以回调的形式执行函数。我是否手动设置超时?@Aliaksandr,var x=“lookUp some value”;回调();非常感谢你的回答,Aliaksandr!正如你在上面的例子中看到的,你的解决方案是有效的,但我仍然不理解回调的概念,我想。。。。我试图给你投票,但由于我的新个人资料,这似乎是不可能的。谢谢!试着看这个视频:它对它的工作原理有非常好的解释。非常感谢你的回答,Aliaksandr!正如你在上面的例子中看到的,你的解决方案是有效的,但我仍然不理解回调的概念,我想。。。。我试图给你投票,但由于我的新个人资料,这似乎是不可能的。谢谢!试着看这个视频:它对它的工作原理有很好的解释。