Одновременное использование setTimeout в JavaScript

У меня есть следующий сценарий:

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

Мне нужен код после setTimeout, который будет выполнен после выполнения кода в setTimeout. Поскольку код, который приходит после setTimeout, не является моим собственным кодом, я не могу поместить его в функцию, вызванную в setTimeout...

Есть ли способ обойти это?

Ответ 1

Является ли код, содержащийся в функции?

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

}

Ответ 2

Я пришел в ситуацию, когда мне нужна была аналогичная функциональность на прошлой неделе, и это заставило меня задуматься над этим сообщением. В принципе, я думаю, что "Занятое ожидание", на которое ссылается @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");

Ответ 3

Просто введите его в обратный вызов:

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

Ответ 4

Нет, поскольку в Javascript нет функции задержки, нет способа сделать это иначе, чем ожидание (что заблокировало бы браузер).

Ответ 5

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

Ответ 6

Вы можете попытаться заменить window.setTimeout своей собственной функцией, например

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

Что может или не может работать должным образом. Помимо этого, ваш единственный вариант - изменить исходный код (который, как вы сказали, вы не сможете сделать)

Имейте в виду, что изменение собственных функций, подобных этому, не является точно очень оптимальным подходом.