Асинхронное программирование и стиль продолжений в JavaScript

В этой статье мы рассмотрим асинхронные функции обратного вызова в JavaScript как продолжения (continuation-passing style aka CPS). Разберемся, как они работают и дадим несколько рекомендаций о их использовании.

Асинхронное программирование и функции обратного вызова

Если вы когда-нибудь программировали на JavaScript, то, вероятно, заметили, что все работает по-другому: вместо возвращения значения, оно передается в функцию обратного вызова. Синхронная программа выглядит следующим образом:

function loadAvatarImage(id) {
    var profile = loadProfile(id);
    return loadImage(profile.avatarUrl);

Анти-паттерны в NodeJS

Синхронное выполнение

Избегаем всех синхронных операций, так же известных как блокирующий ввод/вывод. NodeJS построен на неблокирующим вводе/выводе и любой одиночный блокирующий вызов незамедлительно привносит узкое место.

  • fs.renameSync
  • fs.truncateSync
  • fs.statSync
  • path.existsSync
  • ...

Всех операций блокирующих ввод/вывод необходимо избегать.

Хотя они существуют не спроста. Они могут и должны только использоваться на этапе инициализации вашего сервера. Очень полезно использовать синхронные операции на протяжении инициализации, таким образом вы будете иметь контроль над порядком выполнения, и вам не нужно переживать о функциях обратного вызова которые могли быть, или нет, выполнены к моменту приема первого входящего запроса.…