Как setTimeout работает на Node.JS, пожалуйста, объясните этот фрагмент кода - PullRequest
1 голос
/ 06 ноября 2011

Я только собирался получить грубые руки с Nodejs, но, экспериментируя и играя немного на первом примере, я обнаружил некоторое поведение, которое мне трудно понять.

var a = function () {
    console.log('print 3');
    return 5000;
    };

setTimeout( function (){
   console.log('print 2');
   }, a()
);

console.log('print 1');

Вывод кода выше:

print 3
print 1
print 2

И глупое сомнение в том, что приведенный выше код работает, а этот - нет.

setTimeout( function (){
   console.log('print 2');
   }, (function () {console.log('print 3'); return 5000;} )
);
console.log('print 1');

Пожалуйста, объясните вышеупомянутое поведение.

Ответы [ 3 ]

3 голосов
/ 06 ноября 2011

Лучшее форматирование кода должно помочь вам понять, что происходит.

var a = function () {
  console.log('print 3');
  return 5000;
};

setTimeout( function (){
  console.log('print 2'); # Executed after 5000 ms.
  },
a());                    # Executed first and returns 5000

console.log('print 1');  #Executed second

Следующий фрагмент не работает, так как вы никогда не выполняете 2-ю часть функции.

setTimeout( function (){
  console.log('print 2');
  }, (function () {            # Never executed.
    console.log('print 3');
    return 5000;
  } )
);

console.log('print 1'); 

Будет работать следующее:

setTimeout( function (){
  console.log('print 2');
  }, (function () {            
    console.log('print 3');
    return 5000;
  } )();                      #The brackets () will execute the function.
);

console.log('print 1'); 

В качестве отступления

Пример не имеет ничего общего с node.js и будет давать точно такие же результаты в любом браузере, которыйотвечает на консоль.

1 голос
/ 06 ноября 2011

Вам нужно вызвать второй параметр - setTimeout ожидает число

setTimeout( function (){
   console.log('print 2');
   }, (function () {console.log('print 3'); return 5000;} )()
);
console.log('print 1');
1 голос
/ 06 ноября 2011

setTimeout принимает два аргумента (по крайней мере, так, как вы его используете).

Первый аргумент - это функция для вызова, а второй аргумент - это время задержки перед вызовом.

В первом примере вы передаете анонимную функцию и число (возвращаемое значение a()).

Во втором примере вы передаете две анонимные функции (потому что вы никогда не вызываете вторую функцию (нет ())).

setTimeout( 
    function (){
        console.log('print 2');
    },
    (function () {console.log('print 3'); return 5000;})()
);
console.log('print 1');
...