Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Уродский setTimeout в node (https://javascript.ru/forum/misc/48488-urodskijj-settimeout-v-node.html)

foo 06.07.2014 00:46

Уродский setTimeout в node
 
обнаружил, что на ноде setTimeout не хочет принимать параметром строку, как в нормальных реализациях. Скорей всего с setInterval та же фигня. Пофиксил вот так:
Код:

setT=function(exp, time){return setTimeout(function(){eval(exp)}, time)}

str="console.log('foo')"
setT(str, 100)
id=setT("console.log('bar')", 100)
clearTimeout(id)
//out: foo only

Будет работать?

melky 06.07.2014 01:42

Цитата:

Сообщение от foo
Пофиксил

Цитата:

Сообщение от foo
Будет работать?

так пофиксил или не пофиксил?)

Erolast 06.07.2014 09:16

setTimeout НЕ должен принимать строку, просто эту возможность много где сохраняют в целях совместимости.

foo 06.07.2014 09:29

Цитата:

Сообщение от Erolast
НЕ должен

Почему не должен? Это нодовцы изменили стандартное поведение. Это не первый косяк который я замечаю у них.

По сабжу: мой фикс во всех случаях будет работать?

Erolast 06.07.2014 12:18

Цитата:

Почему не должен? Это нодовцы изменили стандартное поведение. Это не первый косяк который я замечаю у них.
А, проверил, и правда, должен.
Но это не косяк. setTimeout не является частью ECMAScript, он прописан в стандарте браузерного JS W3C. То есть, в ноде никаких стандартов не нарушено - у них свои таймеры, не те, что в браузерах.

Цитата:

По сабжу: мой фикс во всех случаях будет работать?
Ну если не брать в расчет то, что ты сразу же таймаут останавливаешь, то должен, да. Но это не фикс.

Erolast 06.07.2014 13:12

Ну и, если уж и заниматься непотребством, то лучше так:
(function(){
  var setTimeoutOrigin = setTimeout;
  global.setTimeout = function() {
    if (typeof arguments[0] == "string")
      arguments[0] = new Function(arguments[0]);
	
    setTimeoutOrigin.apply(this, arguments);
  };
})();

setTimeout("console.log('dick')", 1000);

kobezzza 06.07.2014 13:17

Что только люди не придумают, лишь бы не учить новый стандарт :)

setTimeout(() => console.log('dick'), 1000);

Erolast 06.07.2014 15:07

Еще пол года до релиза(

kobezzza 06.07.2014 15:11

Цитата:

Сообщение от Erolast (Сообщение 319682)
Еще пол года до релиза(

Я юзаю транслятор уже больше года и всем доволен:)

foo 06.07.2014 16:06

Цитата:

Сообщение от Erolast
то лучше так:

А в чем преимущество?


Часовой пояс GMT +3, время: 22:55.