setTimeout后的回调函数

新手上路,请多包涵

我没有通过下面的回调获得预期的结果。我正在尝试编写一个在 setTimeout 完成后执行的简单回调,但是我看到回调函数首先执行,然后是实际函数。

我在这里缺少什么?得到如下结果。

 doing my homework Maths
finished my homework

这是我要运行的代码。

 function doHomeWork(subject, callback){
setTimeout(function(){console.log("doing my homework:", subject)},500)
callback();
}

doHomeWork("Maths", function(){console.log("finished my homework");});

原文由 yome 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 584
2 个回答

当您调用 setTimeout() 时,将注册一个浏览器回调。这并不意味着后续语句也将稍后执行。它们将在调用函数 setTimeout() 后立即执行。只有你传递的函数参数会在超时时被 setTimeout() 调用。所以,如果回调需要在 setTimeout() 参数化函数之后执行。最好将该调用移到 setTimeout() 函数参数中。所以,代码看起来像

setTimeout(function() {
    //Your stuff
    callback();
}, 500);

原文由 Pooja 发布,翻译遵循 CC BY-SA 4.0 许可协议

您误解了 setTimeout 的用法。

您所要求的正确实现是:

 function doHomeWork(subject, callback){
    setTimeout(callback,500);
    console.log("doing my homework:", subject)
}

doHomeWork("Maths", function(){console.log("finished my homework");});

当您调用 doHomeWork 时,您会做两件事(两行代码): 1. 假设浏览器将回调添加为 500 毫秒后执行的新任务。 2. 打印控制台日志(…)

500 毫秒后,浏览器将添加一个新任务以及将被调用的回调。

原文由 Bruno Carneiro 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题