在 JavaScript 中同步使用 setTimeout

IT技术 javascript settimeout
2021-02-26 20:44:24

我有以下场景:

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

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

有没有办法解决?

6个回答

代码是否包含在函数中?

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

}
@David Hedlund:这是一个不错的方法,但是当代码不在函数中时,有什么方法可以使代码同步?
2021-04-23 20:44:24
我只是创建了一个小型库gitlab.com/ghit/syncjs来创建伪同步 javascript 执行。
2021-05-04 20:44:24
这很棒!!但我的情况完全相似,除了有很多框架代码也位于 setTimeout 调用之上,并且无法再次运行……并且无法将我的代码拆分为不同的功能从 setTimeout 开始。
2021-05-14 20:44:24
我想知道后台发生了什么?setTimeOut 是为了“安排”一个函数供以后执行,让 setTimeout 将函数作为回调推送到事件循环队列会更符合逻辑......
2021-05-15 20:44:24

上周我遇到了需要类似功能的情况,这让我想到了这篇文章。基本上我认为@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");

请记住,此代码实际上会阻止您的浏览器。希望它可以帮助任何人。

实际上,这不会暂停脚本执行,而是在循环完成后执行下一个脚本(调用暂停函数后)。棘手,但在功能上它满足了问题的需要。
2021-05-18 20:44:24

使用 ES6 & promises & async 你可以实现同步运行。

那么代码在做什么呢?

 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();
优秀的答案!每个人都应该尽可能这样做。
2021-04-25 20:44:24
完美的。简单易懂。
2021-05-15 20:44:24
希望您不需要 IE 支持,它不执行异步功能。
2021-05-18 20:44:24

只需将它放在回调中:

setTimeout(function() {
    alert('this alert is timedout and should be the first');
    alert('this should be the second one');
}, 5000);
但他无权访问触发setTimeout?
2021-05-04 20:44:24
抱歉误读。那么你就不走运了。setTimeout如果总是异步。
2021-05-15 20:44:24
而且由于 setTimeout 之后的代码不是我自己的代码,我不能把它放在 setTimeout 中调用的函数中......我正在使用一个框架,所以我不能把框架代码放在那里...
2021-05-17 20:44:24
伙计,这是异步的。
2021-05-17 20:44:24

不,由于 Javascript 中没有延迟功能,因此除了忙等待(这会锁定浏览器)之外,没有其他方法可以做到这一点。

我总是避免在没有任何限制的情况下进行检查
2021-05-04 20:44:24
var until = new Date().getTime() + 3000; while(new Date().getTime() < until) {}; alert('3 seconds passed');
2021-05-09 20:44:24
能否请您详细说明繁忙的等待 Idea 及其工作原理。
2021-05-11 20:44:24