在JavaScript中同步使用setTimeout

时间:2010-11-08 08:33:32

标签: javascript settimeout

我有以下情况:

setTimeout("alert('this alert is timedout and should be the first');", 5000);
alert("this should be the second one");

我需要在执行setTimeout中的代码后执行setTimeout之后的代码。由于setTimeout之后的代码不是我自己的代码,我不能把它放在setTimeout中调用的函数中......

有什么方法吗?

9 个答案:

答案 0 :(得分:61)

代码是否包含在函数中?

function test() {
    setTimeout(...);     

    // code that you cannot modify?
}

在这种情况下,您可以阻止该函数进一步执行,然后再次运行:

function test(flag) {

    if(!flag) {

        setTimeout(function() {

           alert();
           test(true);

        }, 5000);

        return;

    }

    // code that you cannot modify

}

答案 1 :(得分:33)

我遇到了上周需要类似功能的情况,这让我想起了这篇文章。基本上我认为@AndreKR所指的“忙碌等待”在很多情况下都是合适的解决方案。下面是我用来占用浏览器并强制等待条件的代码。

function pause(milliseconds) {
	var dt = new Date();
	while ((new Date()) - dt <= milliseconds) { /* Do nothing */ }
}

document.write("first statement");
alert("first statement");

pause(3000);

document.write("<br />3 seconds");
alert("paused for 3 seconds");

请注意,此代码实际上会占用您的浏览器。 希望它可以帮助任何人。

答案 2 :(得分:6)

把它放在回调中:

setTimeout(function() {
    alert('this alert is timedout and should be the first');
    alert('this should be the second one');
}, 5000);

答案 3 :(得分:5)

不,因为Javascript中没有延迟功能,除了忙碌等待(这会锁定浏览器)之外,没有办法做到这一点。

答案 4 :(得分:4)

ES6(忙碌等待)

const delay = (ms) => {
  const startPoint = new Date().getTime()
  while (new Date().getTime() - startPoint <= ms) {/* wait */}
}

用法:

delay(1000)

答案 5 :(得分:2)

setTimeout(function() {
  yourCode();    // alert('this alert is timedout and should be the first');
  otherCode();   // alert("this should be the second one");
}, 5000);

答案 6 :(得分:1)

我认为您必须做出承诺,然后使用.then()才能将代码链接在一起。您应该看一下这篇文章https://developers.google.com/web/fundamentals/primers/promises

答案 7 :(得分:0)

您可以尝试将window.setTimeout替换为您自己的函数,如此

window.setTimeout = function(func, timeout) {
    func();
}

根本不可能正常工作。除此之外,您唯一的选择是更改原始代码(您说不能这样做)

请记住,改变这样的原生功能并不是一种非常优化的方法。

答案 8 :(得分:0)

使用ES6&amp;承诺与异步你可以同步实现运行。

那么代码在做什么?

 1. Calls setTimeOut 1st inside of demo then put it into the webApi Stack
 2. Creates a promise from the sleep function using the setTimeout, then resolves after the timeout has been completed;
 3. By then, the first setTimeout will reach its timer and execute from webApi stack. 
 4. Then following, the remaining alert will show up.


function sleep(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}

async function demo() {
  setTimeout("alert('this alert is timedout and should be the first');", 5000);
  await sleep(5000);
  alert('this should be the second one');
}
demo();