ОК, давайте посмотрим на это:
.then(
(data, err) => (ctx.body = data),
(err) => {
ctx.response.status = 404;
ctx.body = err;
}
);
- Он передает две жирные функции стрелок в
.then()
. Первая - это функция, вызываемая в случае разрешения обещания, вторая - функция, вызываемая в случае отклонения. Логически, структура этого вида .then(resolveCalback, rejectCallback)
. - Первая жирная стрелка имеет два аргумента,
(data, err)
. Это неверно. При любой стандартной реализации обещания в обработчик .then()
передается только один аргумент. К счастью, реализация не использует второй аргумент, который всегда будет undefined
. - Эта первая функция жирной стрелки просто перемещает разрешенное значение с
data
на ctx.body
. Очевидно, что вызывающая функция, которая возвращает это обещание, будет искать разрешенное значение в ctx.body
. - Вторая функция жирной стрелки также устанавливает объект
ctx
со значением состояния и ошибки. И, что важно, это НЕ отбрасывание или возврат отклоненного обещания. Таким образом, он меняет обещание с отклоненного на решенное. Таким образом, вызывающая сторона только когда-либо получит разрешенное обещание от этой функции и, вероятно, должна будет проверить ctx.response.status
, чтобы узнать, есть ли ошибка или нет.
Если функции жирной стрелки сбивают вас с толку, тогда этот фрагмент кода можно выразить так, используя обычные функции:
.then(function(data) {
ctx.body = data;
return data;
}, function(err) {
ctx.response.status = 404;
ctx.body = err;
});
Данные и ошибки здесь означают разрешение и отклонение здесь?
Нет. Смотрите мой второй пункт выше. Только data
является действительным и содержит разрешенное значение обещания. Наличие err
в качестве аргумента для этого первого clalback является ошибкой программирования. Это не прошло там. Отклонить обратный вызов - это вторая функция обратного вызова.
Обычно в обещаниях происходит вызов функции после .then, поэтому я немного запутался в этой ситуации.
Этижирные стрелки (другой тип объявления функции). Итак, две функции передаются как .then(fn1, fn2)
. Вы можете прочитать о жирных стрелках здесь, в MDN и здесь, в SitePoint . Их основное назначение - это быстрый синтаксис и различная обработка значения this
внутри функции. В этом случае программист, вероятно, использовал их для более короткого синтаксиса, поскольку нет ссылок на this
.