2016-11-09 2 views
0

Возможно ли реализовать функцию, эквивалентную setTimeout(), в JavaScript? Если да, то каков был бы лучший способ сделать это?Возможно ли реализовать эквивалент setTimeout() в javascript?

function setTimeout(callback, time_in_ms) 
{ 
    // Implementation of time elapse of time_in_ms 
    callback(); 
} 

Я задаю этот вопрос из любопытства. Простой «Нет, это невозможно» также будет достаточным ответом на этот вопрос.

+3

Что? почему бы вам просто не использовать существующую? – Liam

+4

Там не будет ни одного, если вы не заблокируете нить, которая равна – musefan

+3

. Пожалуйста, объясните почему. Похоже на проблему X/Y – mplungjan

ответ

5

Могу ли я реализовать setTimeout() в javascript самостоятельно?

Нет - не без какого-либо другого асинхронного API. Возможно, вы сможете реализовать его с точки зрения setInterval, с веб-рабочими requestAnimationFrame или действительно что-нибудь, что работает в том же цикле событий, что и setTimeout. Но если есть причина, которая мешает вам использовать встроенный setTimeout, вероятно, есть и другие проблемы с вашей средой - так что это зависит от конкретной ситуации.

+1

Почему любой из этих методов будет доступен, если 'setTimeout' не является? – Cerbrus

+2

@Cerbrus То, что я не знаю, но мне любопытно, чтобы ОП разработал свой сценарий :-) – Bergi

+1

Принимая во внимание тот факт, что ОП не проявлял никаких признаков жизни с момента подачи вопроса, я сомневаюсь мы когда-нибудь узнаем. Лично я предпочел бы просто избавиться от вопроса. Как сейчас, это не имеет никакого значения для SO. – Cerbrus

1

Синхронные (не асинхронный) setTimeout эквивалент будет что-то вроде этого:

function myTimeout(fun, milisecs) { 
 
    var nowT = Date.now(); 
 
    while(Date.now()< nowT+milisecs){ 
 
     continue; 
 
    } 
 
    fun(); 
 
} 
 
function consout() { 
 
    console.log('The future arrived now!'); 
 
} 
 

 
myTimeout(consout,2000);

Однако, как Bergi mentioned вы, вероятно, хотите асинхронный API, чтобы избежать срыва выполнения JavaScript в вашем браузер.

Worker имеет возможности многопоточные, чтобы позволить этому, с такими функциями, как myWorker.port.start() и myWorker.terminate() ... Я никогда не нуждались, чтобы создать что-то с рабочими или подобным APIs, но, возможно, вы можете исследовать немного больше в этой области (Я также не должен выполнять домашнее задание, если это так).

+2

Этот код является «[Ожидание ожидание] (https://en.wikipedia.org/wiki/Busy_waiting)». Это довольно плохая идея, поскольку она блокирует все остальное_ от запуска. В принципе, это не тайм-аут, а функция 'wait', которая принимает обратный вызов. – Cerbrus

+0

Спасибо за ссылку @Cerbrus. Я знаю, что вращение, поэтому я упомянул, что это синхронно останавливает выполнение Javascript браузера ... Как правило, это очень плохая идея, как вы упомянули. – CPHPython

+0

Это очень умное решение. Мне нравится, как вы можете смешивать с датой сейчас, чтобы создать psuedo 'setTimeout()'. Я не уверен в других решениях, но это может быть ответ, который ищет OP. –

Смежные вопросы