TJ Holowaychuk критикует NodeJs

История, прочитанная: https://medium.com/code-adventures/4ba9e7f3e52b

TJ говорит, что node терпит неудачу, потому что:

  • вы можете получать повторяющиеся обратные вызовы
  • вы не можете получить обратный вызов вообще (потерянный в неопределенности)
  • вы можете получить внеполосные ошибки.
  • эмитенты могут получать несколько событий "ошибки"
  • Отсутствие событий "error" отправляет все в ад
  • часто не уверены, что требуют обработчиков ошибок.
  • Обработчики ошибок являются очень подробными
  • callbacks suck

Может ли кто-нибудь сообщить о проблемах, упомянутых в TJ? Например, я никогда не видел проблем с двойным выполнением обратных вызовов. При каких условиях это произойдет?

EDIT Для тех, кто голосует: Если вы не знаете, кто такой TJ, он отвечает за большинство модулей npm. Таким образом, это не "бездействующий" разглашение неинформированным пользователем. Его уход сильно повредит узлам, и этот вопрос пытается получить ответы на специфику критики. Я никогда не вижу этих проблем. Вы?

Ответы

Ответ 1

1: может произойти, когда вы завершаете поток в функции:

function doSomething (callback) {
    var stream = createStream();
    stream.resume();
    stream.on('end', callback);
    stream.on('error', callback);
}

так что если end срабатывает, то error срабатывает?

2: то же самое, что, если ничего не срабатывает (например, удалить stream.resume)? Это, очевидно, ошибка в функции, но вы видите, что все просто зависает.

4: вы наивно подключаете некоторые асинхронные функции для генерации событий error от эмиттера, а затем, когда возникает ошибка, слушатель пытается уничтожить эмиттер, вызывает другое событие error и заканчивается в бесконечном цикле.

5,6,7: каждый излучатель без error прослушивателя может потенциально привести к краху вашего приложения. У вас есть два варианта: попытайтесь понять, где безопасно опустить один или добавить их явно везде.

8: спорный. TJ является сторонником сопрограмм, так что это просто его мнение.

Ответ 2

Цитата из следующего абзаца,

[...] вы можете подумать, что процедура полностью закончена, пока библиотека случайно не вызывает обратный вызов несколько раз или не очищает обработчики должным образом и вызывает повторный запуск кода [...]

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