Подтвердить что ты не робот

Как скрыть поток в node.js, не затрагивая другие потоки?

По Понимание цикла событий node.js, node.js поддерживает модель с одним потоком. Это означает, что если я делаю несколько запросов на сервер node.js, он не будет порождать новый поток для каждого запроса, а будет выполнять каждый запрос один за другим. Это означает, что если для первого запроса в моем node.js-коде я делаю следующее: первый запрос приходит на node, второй запрос должен дождаться завершения первого запроса, включая 5 секундное время ожидания. Правильно?

var sleep = require('sleep');
    sleep.sleep(5)//sleep for 5 seconds

Есть ли способ, которым node.js может порождать новый поток для каждого запроса, чтобы второй запрос не должен был ждать завершения первого запроса или я могу вызвать вызов только для определенного потока?

4b9b3361

Ответ 1

Если вы ссылаетесь на модуль npm sleep, в readme отмечается, что sleep заблокирует выполнение. Итак, вы правы - это не то, что вы хотите. Вместо этого вы хотите использовать setTimeout, который не блокирует. Вот пример:

setTimeout(function() {
  console.log('hello world!');
}, 5000);

Для тех, кто хочет это сделать, используя es7 async/await, этот пример должен помочь:

const snooze = ms => new Promise(resolve => setTimeout(resolve, ms));

const example = async () => {
  console.log('About to snooze without halting the event loop...');
  await snooze(1000);
  console.log('done!');
};

example();

Ответ 2

Если у вас есть цикл с асинхронным запросом в каждом из них, и вы хотите, чтобы определенное время между каждым запросом вы могли использовать этот код:

   var startTimeout = function(timeout, i){
        setTimeout(function() {
            myAsyncFunc(i).then(function(data){
                console.log(data);
            })
        }, timeout);
   }

   var myFunc = function(){
        timeout = 0;
        i = 0;
        while(i < 10){
            // By calling a function, the i-value is going to be 1.. 10 and not always 10
            startTimeout(timeout, i);
            // Increase timeout by 1 sec after each call
            timeout += 1000;
            i++;
        }
    }

Эти примеры ждут 1 секунду после каждого запроса перед отправкой следующего.