Я запустил node.js месяц назад. Первое, с чем я боролся, это асинхронный ввод-вывод. Теперь я к этому несколько привык. Следующее, с чем я сейчас борюсь, - это ад обратных вызовов. Если вы не знаете, что такое ад обратного вызова, посмотрите фиктивный код ниже. Если вы знакомы с адом обратных вызовов, переходите к следующей части.
Ничего особенного. Мы подключились к базе данных. Мы передали функцию в качестве параметра (известную как обратный вызов) для выполнения при установке соединения. Скажем, его имя - обратный вызов соединения. Внутри обратного вызова соединения мы выполнили запрос и передали другой обратный вызов для выполнения при выполнении запроса. Скажем, это обратный вызов выполнения. Внутри обратного вызова выполнения мы закрыли соединение и после закрытия отправили ответ, используя другой обратный вызов.
Примечательно, что мы проверили ошибки в каждом обратном вызове. Если ошибка истинна (не является ни нулевым, ни неопределенным), то мы показали ошибку и больше не выполняли никаких действий.
Теперь посмотрим на код еще раз. Насколько беспорядочным может быть простая 24 строчка кода! В реальных приложениях ад обратных вызовов может быть намного глубже, запутаннее и ужаснее.
Я искал более чистый код, и Promise
API меня спас. Если вы не знаете, что такое Promise API, отметьте это в MDN. Давайте посмотрим, как мы обещаем выбраться из ада обратных вызовов. Проверьте следующий фрагмент кода.
Во фрагменте кода мы преобразовали каждый из наших обратных вызовов в обещание. API обещания прост. Передайте обратный вызов constructor
. Обратный вызов примет два параметра resolve
и reject
. Внутри обратного вызова вы сделаете свою работу. Если это произойдет, напишите вызов resolve
, а если что-то пойдет не так, вызовите reject
.
Затем используйте эти обещания, как в следующем фрагменте кода.
В API обещаний вы просто вызываете функцию, которая возвращает обещание. Затем соедините then
функцию. Функция then
принимает обратный вызов, который будет выполняться при вызове resolve
с тем же параметром, переданным в then
. Вы можете добавить функцию catch
в цепочку. Обратный вызов, переданный в функцию catch
, выполняется, если вызывается reject
и, очевидно, с тем же параметром. Обратите внимание, что ни resolve
, ни reject
не могут передавать более одного параметра. Итак, если вам нужно передать более одного параметра, вам нужно объединить их в один объект.
А сейчас до свидания. Добрый день!