NodeJS работает с переменными и одновременными подключениями - PullRequest
0 голосов
/ 11 декабря 2018

Я пытаюсь обдумать, как javascript и nodejs работают с одновременными соединениями.

Рассмотрим следующий минимальный пример:

var app = express();
var i = 0;

app.get("/", function(req, res) {

    if (i < 10){
         doSomething();
         i++;
    }else{
         doDefault();
    }

    res.render("test");
}

Следующий код выполняет doSomething (), есливы заходите на страницу 10 раз, но затем делает doDefault () для последующих запросов.

Возможно ли, что doSomething () запускается 11 или более раз?Поскольку множественные одновременные запросы к серверу могут оценить, что i <10 соответствует действительности, но запросы выполняют i ++ одновременно? </p>

Что произойдет, если doSomething () читает файл локально на сервере, этот запрос будет выполняться одновременнов Javascript (с обратными вызовами или обещаниями, так как это способ узла делать вещи) и по-прежнему продолжать выполнять.Тогда было бы безопасно сделать это вместо этого:

if (i < 10){
    i++;
    doSomething();
}

Теперь я гарантирую, что функция doSomething () будет выполняться ровно 10 раз, даже если тысячи запросов одновременно попадут на сервер?

1 Ответ

0 голосов
/ 12 декабря 2018

Вот тут и возникает асинхронная природа. Несмотря на то, что вы делали параллельный запрос к NodeJS, однако запрос приходит один за другим на сервер.И все по умолчанию синхронно в Javascript означает, что следующий запрос может быть обработан только после первого.Так что если ваш API включает код блокировки, который занимает 5 минут, то ваш следующий запрос будет выполнен через 5 минут, даже если он поступил в то же время.

В вашем примере doSomething() может быть синхронным или асинхронным, оно не влияет на синхронный поток и будет i++ перед принятием следующего запроса.

Для имитации вы можете попробовать большое значение дляЗацикливайтесь и смотрите, когда будет получен ответ на следующий вызов API.

var app = express();
var i = 0;

app.get("/", function(req, res) {
  console.log('request received i = ', i);

  for(let j = 0; j<9999999999999; j++) {}

  i++;
  res.render("test");
}

, если вы хотите выполнить весь параллельный запрос даже для i>10, просто увеличьте i после некоторой асинхронной функции.

app.get("/", function(req, res) {
  console.log('request received i = ', i);

  if (i<10) {
    setTimeout(function(){
      i++;
    },5000);
  } else {
    doSomethingElse();
  }
  res.render("test");
}

Любое число запросов, полученных в течение 5 секунд после первого запроса, будет выполнено, поскольку значение i не увеличивается и будет увеличиваться после асинхронной работы в течение 5 секунд.Это логика для асинхронного цикла и цикла обработки событий.

Проверьте это на больше по циклу событий .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...