我在下面的回调中没有得到预期的结果。我正在尝试写一个简单的回调,它在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");});
当您调用setTimeout()
时,会注册浏览器回调。这并不意味着后续的陈述也会在以后执行。它们将在调用函数setTimeout()
后立即执行。发生超时时,setTimeout()
将仅调用您传递的函数参数。所以,如果回调需要在setTimeout()
参数化函数之后执行。最好在setTimeout()
函数参数中移动该调用。所以,代码看起来像
setTimeout(function() {
//Your stuff
callback();
}, 500);
你错过了setTimeout
的用法。
正确实现您的要求是:
function doHomeWork(subject, callback){
setTimeout(callback,500);
console.log("doing my homework:", subject)
}
doHomeWork("Maths", function(){console.log("finished my homework");});
当您调用doHomeWork
时,它会执行两项操作(两行代码):1。假设浏览器将回调添加为500ms后要执行的新任务。 2.打印console.log(...)
在500ms之后,浏览器将添加一个带有将被调用的回调的新任务。