Как скрыть поток в 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 может порождать новый поток для каждого запроса, чтобы второй запрос не должен был ждать завершения первого запроса или я могу вызвать вызов только для определенного потока?
Ответы
Ответ 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 секунду после каждого запроса перед отправкой следующего.