Являются ли эти параметры «расширенными», разрешить и отклонить в Promise? - PullRequest
0 голосов
/ 21 октября 2019

Я повторно использую какой-то код, найденный на Github, и я придумал какой-то код, который я не уверен, что это такое. Это весь код;

const checkifRightPw = (ctx, next) => {
return new Promise((resolve, reject) => {
        users.getUserByEmail(ctx.params.user_email).then((users) => {
            if (users.length > 0) {
                resolve(users);
            } else {
                reject('email doesnt exist');
            }
        });
    }).then(
        (data, err) => (ctx.body = data),
        (err) => {
            ctx.response.status = 404;
            ctx.body = err;
        }
    );
}

Меня интересуют следующие строки кода:

(data, err) => (ctx.body = data),
   (err) => {
   ctx.response.status = 404;
   ctx.body = err;
}

Имеет ли data и err для решения и отклонения здесь? Обычно в обещаниях после .then происходит вызов функции, поэтому я немного запутался в этой ситуации.

1 Ответ

0 голосов
/ 21 октября 2019

ОК, давайте посмотрим на это:

.then(
        (data, err) => (ctx.body = data),
        (err) => {
            ctx.response.status = 404;
            ctx.body = err;
        }
 );
  1. Он передает две жирные функции стрелок в .then(). Первая - это функция, вызываемая в случае разрешения обещания, вторая - функция, вызываемая в случае отклонения. Логически, структура этого вида .then(resolveCalback, rejectCallback).
  2. Первая жирная стрелка имеет два аргумента, (data, err). Это неверно. При любой стандартной реализации обещания в обработчик .then() передается только один аргумент. К счастью, реализация не использует второй аргумент, который всегда будет undefined.
  3. Эта первая функция жирной стрелки просто перемещает разрешенное значение с data на ctx.body. Очевидно, что вызывающая функция, которая возвращает это обещание, будет искать разрешенное значение в ctx.body.
  4. Вторая функция жирной стрелки также устанавливает объект 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.

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