setTimeout

时间:2019-03-23 14:38:04

标签: javascript callback

在下面的回调中,我没有得到预期的结果。我正在尝试编写一个简单的回调,该回调在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");});

3 个答案:

答案 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等待该等待函数电话。

如果您没有得到任何东西,则可以要求进一步的解释。