setTimeout等待setTimeout

时间:2014-01-12 11:35:06

标签: javascript jquery

我偶然发现了一个问题: 该代码应按此顺序输出“hi1”“hi2”“hi3”“hi4”。 我写了这个简化的代码,实际的代码更复杂,导致我无法删除我标记的一些函数。

function test() {
    console.log("hi2");
    setTimeout(function () { //maybe replace this?
    console.log("hi3");
    }, 2000);
}

console.log("hi1");
test();
setTimeout(function () { //cannot get rid of this
    console.log("hi4");
}, 0);

如何按顺序输出?

3 个答案:

答案 0 :(得分:1)

如果您需要等待setTimeouttest()执行才能继续,最简单的方法是使用回调:

function test(callback) {
    console.log("hi2");
    setTimeout(function () {
        console.log("hi3");
        // Execute additional logics
        callback();
    }, 2000);
}

console.log("hi1");
test(function () {
    setTimeout(function () {
        console.log("hi4");
    }, 0);
});

答案 1 :(得分:0)

使用回调或尝试显示更复杂的代码。我们可以帮助您分析它。

答案 2 :(得分:0)

正如其他人指出的那样,setTimeout是异步的,所以它们在后台运行,而其余代码继续运行。我猜你现在得到类似的东西:

hi1
hi2
hi4
then a 2000ms delay, then
hi3

如果您无法更改代码,请尝试将hi4的延迟更改为4000,如:

setTimeout(function () { //cannot get rid of this
    console.log("hi4");
}, 4000);

这应该可以修复订单,但它仍然非常混乱且不可靠。我宁愿有类似的东西:

function showMessage(msg, delay) {
    setTimeout(function() {
        console.log(msg);
    }, delay);
}
showMessage('hi1', 0);
showMessage('hi2', 2000);
showMessage('hi3', 4000);
showMessage('hi4', 6000);