Как в JS сделать функцию асинхронной?
Алексей Тен: посоветовал пользовать setTimeout
в NodeJS есть метод
process.NextTick(callback(){
  //ваш код
});
В Node работает всего два потока (по умолчанию. Вроде бы можно как-то запустить дополнительные event-loop'ы, но это совсем другая история). Первый - main поток, исполняющий ваш код, второй - поток обработки асинхронных операций (EventLoop). Пока вы свой код не поместили в очередь на выполнение, он будет выполняться в синхронном режиме, т.е. в потоке main. process.NextTick помещает ваш код в очередь и сразу же возвращает управление main-потоку.
Вроде как-то так. 
ЗЫ: Поправьте, если я где-то ошибся.
process.NextTick помещает ваш код в очередь и сразу же возвращает управление main-потоку.
Вроде как-то так. 
ЗЫ: Поправьте, если я где-то ошибся.
Если ставить в очередь с помощью nextTick, то в данном случае вы получите по сути тот-же синхронный вариант.
Дело в том, что nextTick имеем высший приоритет в очереди, и если мы на основании его сделаем "рекурсивный коллбэк" то получим его четко последовательное выполнение, как обычной рекурсии.function sleep(ms, callback) {
  var cDateMs = (new Date()).getTime() + ms;
  process.nextTick(function waitForTime() {
    if (cDateMs > (new Date()).getTime()) {
      process.nextTick(waitForTime);
    } else {
      callback();
    }
  });
}
Вместо nextTick() нужно использовать setImmidiate.function sleep(ms, callback) {
  var cDateMs = (new Date()).getTime() + ms;
  setImmediate(function waitForTime() {
    if (cDateMs > (new Date()).getTime()) {
      setImmediate(waitForTime);
    } else {
      callback();
    }
  });
}