Вопрос, касающийся асинхронных обратных вызовов в express/node.js

#node.js #express #asynchronous #socket.io

#node.js #экспресс #асинхронный #socket.io

Вопрос:

Я отвечаю за улучшение внутреннего программного стека, который использует express, node.js, и socket.io

Есть несколько конечных точек REST, а также обратные вызовы. Они срабатывают, когда кто-то отправляет данные через сокет.io с интерфейса. Как конечные точки, так и сокет.обратные вызовы ввода-вывода объявляются как асинхронные, так как они вызывают многие функции с ожиданием:

Примеры:

static async someEndpoint(req: Request, res: Response, next: NextFunction): Promiselt;anygt; { ... code which calls functions with await }

client.on("some-socket", async (data, callback) =gt; { ... code which calls functions with await }

Хотя они объявлены как асинхронные, я хочу, чтобы эти функции выполнялись взаимоисключающе, чтобы в любой момент времени выполнялась только одна конечная точка express или один обратный вызов сокета. Я думал, что и конечные точки, и обратные вызовы обрабатываются последовательно циклом событий узла, даже если они объявлены как асинхронные.

Но теперь я увидел, что бывают ситуации, когда одновременно выполняются два обратных вызова сокетов. По крайней мере, я почти уверен, что они это делают 😉

Итак, что я могу сделать, чтобы улучшить эту ситуацию? Я уже защитил некоторые асинхронные части своего кода с помощью мьютекса, нужно ли мне делать это и здесь?

Если вам нужна дополнительная информация, я, конечно, предоставлю ее.

Большое спасибо за ваши ответы! Я уже искал переполнение стека, но пока не смог найти ответа.

С уважением

Майкл

Комментарии:

1. предполагая, что вам нужна эксклюзивность, тогда да, вам понадобится мьютекс или аналогичный метод (одноэлементный класс и т. Д.) Для обработки потока управления.

2. вероятно, вы могли бы также создать решение на основе обещаний для этого, в зависимости от того, как на самом деле работает ваш поток кода…