Давайте рассмотрим распространенный шаблон многократного использования для преобразования API, управляемого событиями, в ориентированный на задачи async / await.

В качестве примера мы можем использовать WebSockets. WebSockets просты и удобны.

Должно быть прямолинейно. Но что, если бы нам пришлось взаимодействовать с протоколом, который не так прост?

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

Довольно сложно. Писать реализацию в WebSockets с обычными прослушивателями событий довольно неуклюже. Какая у нас есть лучшая альтернатива?

Ответ - async / await.

Было бы неплохо написать такой код:

Вместо того:

Ход программы немного менее очевиден. Если мы добавим больше сложности к протоколу (больше погодных условий, больше логических путей), то слушатель событий станет более сложным.

Как мы можем улучшить API WebSocket? Мы можем написать ожидающий connect ():

Теперь каждое сообщение ставится в очередь в ожидании вызова метода receive ().

Следующее, что нужно сделать, это реализовать receive ():

Были сделаны! Мы готовы ждать этих вызовов функций, сколько захотим.

Моя небольшая библиотека WebSocket-async доступна:

Unpkg: https://unpkg.com/websocket-async

Npm: https://www.npmjs.com/package/websocket-async

Добро пожаловать на Github!