2010-11-08 3 views
40

У меня есть следующий сценарий:использования 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 ...

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

ответ

51

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

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 

} 
+0

Это действительно приемлемое обходное решение, отлично! – Nathan

+0

это замечательно !! но мой полностью аналогичный случай, за исключением того, что существует много кода фреймворка, который также находится над вызовом setTimeout, и его нельзя заставить запустить снова ... и не удастся разделить мой код на разные функции от того места, где setTimeout срабатывает. – mickeymoon

+2

@David Hedlund: Это хороший подход, но есть ли способ сделать код синхронным, когда код не находится в функции? –

5

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

+0

Можете ли вы разработать занятую ожидания идеи и ее работу. –

+5

'var до = new Date(). GetTime() + 3000; while (new Date(). getTime() <до) {}; alert ('3 секунды прошло'); ' – AndreKR

+0

Я всегда избегаю, пока для проверки без дросселя – tom10271

6

Просто поместите его в функцию обратного вызова:

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

Но у него нет доступа к коду, который запускает' setTimeout'? – Marko

+0

И поскольку код, который приходит после setTimeout, не является моим собственным кодом, я не могу поместить его в функцию, вызванную в setTimeout ... Я работаю с фреймворком, поэтому я не могу просто поместить код фреймворка в там ... – Nathan

+0

Извините за неправильное чтение. Ну, тогда вам не повезло. 'setTimeout', если он всегда асинхронный. –

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

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

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

, которые могут или не могут работать должным образом вообще. Кроме того, единственным вариантом было бы изменить исходный код (который, как вы сказали, вы не можете сделать)

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

26

Я пришел в ситуации, когда я нуждался в подобную функциональность на прошлой неделе, и это заставило меня подумайте об этом посту. В принципе, я думаю, что «Занятое ожидание», на которое ссылается @AndreKR, будет подходящим решением во многих ситуациях. Ниже приведен код, который я использовал для запуска браузера и принудительного ожидания.

function pause(milliseconds) { 
 
\t var dt = new Date(); 
 
\t 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");

Имейте в виду, что этот код acutally держит ваш браузер. Надеюсь, это поможет кому угодно.

+0

На самом деле это не приостанавливает выполнение скрипта, но следующий скрипт (после функции приостановки вызова) будет выполнен после завершения цикла. Трудно, но функционально это отвечает потребностям вопроса. –

0

ES6 (занят ожидания)

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

использование:

delay(1000) 
Смежные вопросы