асинхронные вызовы в node.js - PullRequest
0 голосов
/ 26 июня 2018

У меня есть базовое недопонимание относительно асинхронных вызовов с использованием экспресс-и промежуточного программного обеспечения, и я был бы очень признателен за помощь в его понимании.

Предположим, у нас есть этот код:

var express = require('express')
var cookieParser = require('cookie-parser') 

var app = require('express')
var router = express.Router()

app.use(function timeLog (req, res, next) {
  req.requestTime = Date.now()
  next()
})

app .use(express.json());
app .use(express.urlencoded());
app.use(cookieParser())

router.post('/hello', function (req, res) {
  //write async to file
  res.send('bye')
})

Теперь, когда клиент вызывает эту конечную точку "привет":

  1. промежуточное программное обеспечение, определенное на уровне приложений, называется асинхронным? Я понял, что они это делают (потому что в документации они называются «обратными вызовами» ... так что, в основном, до того, как добраться до маршрутизатора: разбор файлов cookie, разбор json в req.body и добавление req.requestTime будет выполняться асинхронно, а затем будет перенаправлен на ' / Привет 'конечная точка.

  2. после маршрутизации обратный вызов будет работать асинхронно? если да, то как в этом случае запрос не останется зависшим? я вижу, что ответ завершается внутри тела обратного вызова ... как это имеет смысл? (

Может, кто-нибудь объяснит мне этот поток?

Я попытаюсь объяснить, как я понял «асинхронные вызовы» через этот код выше: скажем, много пользователей, пытающихся получить эту конечную точку. все эти вызовы добавляются в стек вызовов, то есть из-за того, что эти обратные вызовы являются асинхронными, они перемещаются в очередь / таблицу событий и будут обрабатываться после того, как стек вызовов станет «пустым». если это так, как первый пользователь когда-либо получит ответ? requestTime выполняется асинхронно, анализирует json done асинхронно, и при достижении маршрутизатора обратный вызов выполняется асинхронно .... поэтому, когда первый пользователь когда-либо получит ответ, если все эти асинхронные вызовы расположены внутри очереди / таблицы событий, и они будут обрабатываться только после того, как стек вызовов пуст? что мне здесь не хватает?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 27 июня 2018

Промежуточное программное обеспечение не выглядит само по себе асинхронным. Другими словами, как вы сказали в своем комментарии к другому ответу, не заставляет каждый слой в «стеке» промежуточного программного обеспечения / обработчиков expressjs в отдельный фрейм в очереди событий JavaScript.

Если вы отслеживаете функцию next() в .use(), есть пара setImmediate довольно рано для обработки «выходного маршрутизатора» или «больше слоев», но затем вы попадаете в while цикл на стеке обработчиков. Это происходит в районе этой точки в коде .

Так что, если все ваше промежуточное ПО было похоже на этот раздел, все промежуточное ПО и т. Д. Происходили бы в одном кадре в очереди событий:

app.use(function(req, res, next){
  console.log('synchronous layer');
  next();
});

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

app.use(function(req, res, next){
  setImmediate(()=> {
    console.log('setImmediate puts this next() into a separate frame in the event queue');
    next();
  });
});

Не могу себе представить, что это обычно будет проблемой. Большинство вещей, которые могут произойти в промежуточном программном обеспечении, что может занять некоторое время (вызов базы данных и т. Д.), Вполне вероятно, что все будет происходить асинхронно (таким образом, что next помещается в новый кадр в очереди событий). Но об этом стоит подумать, когда вы добавляете промежуточное ПО ...

0 голосов
/ 26 июня 2018

Все эти промежуточные программы используют стиль передачи продолжения. Так что в принципе они МОГУТ работать асинхронно. Но они не должны. Это зависит от того, делают ли эти промежуточные программы некоторые операции ввода-вывода. Вы можете взглянуть на код, чтобы проверить, как функции ведут себя точно, но, по крайней мере, это не имеет значения. Просто имейте в виду, что они МОГУТ работать асинхронно.

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