在下面的回调中,我没有得到预期的结果。我正在尝试编写一个简单的回调,该回调在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");});
答案 0 :(得分:1)
当您致电setTimeout()
时,浏览器回调已注册。这并不意味着后续语句也将在以后执行。它们将在调用函数setTimeout()
之后立即执行。发生超时时,setTimeout()
仅调用您传递的函数参数。因此,如果需要在setTimeout()
参数化函数之后执行回调。最好在setTimeout()
函数参数内移动该调用。因此,代码看起来像
setTimeout(function() {
//Your stuff
callback();
}, 500);
答案 1 :(得分: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.打印console.log(...)
500毫秒后,浏览器将添加一个新的任务,并带有将被调用的回调。
答案 2 :(得分:0)
如果您想在该回调之前等待,特别是如果回调是API调用,则创建一个单独的函数并从该函数的setTimeout
内部返回已解决的Promise,并在执行API之前使用async await等待该等待函数电话。
如果您没有得到任何东西,则可以要求进一步的解释。