Вернуть объект с функцией «then» в «Promise.then ()» - PullRequest
0 голосов
/ 28 декабря 2018

В моем приложении Node.JS я написал функцию (findByReference), которая отправляется в базу данных и асинхронно выдает извлеченную строку базы данных.Я написал эту функцию с помощью обещаний.Кроме того, я написал реализацию монады Maybe и хочу, чтобы моя функция findByReference выдавала экземпляр Maybe.

Мой код выглядит следующим образом:

findByReference(r)
  .then(raw => raw ? Just(raw) : Nothing())
  .then(row => {
    (row instanceof Maybe) === true;
  });

Не вдаваясь в то, что означают Just и Nothing, значение этого (из-за того, как я написал Maybe) состоит в том, что переменная row в приведенном выше коде имеет функцию под названием"затем" .Короче говоря, кажется, что Javascript запутывается и по какой-то причине автоматически вызывает МОЕ «затем» и вместо передачи Maybe фактически передает обратному вызову то, что МОЕ «затем» возвращает в качестве значения row.Это явно приводит к всевозможным странным действиям.Если я просто удаляю функцию «then» из моего объекта, то все это работает, как и ожидалось.

Я знаю, что если Promise.then вернет другое Promise, то выполнение будет приостановлено до тех пор, пока это обещание не будет выполнено.Я не смог найти никакой официальной документации, подтверждающей это, но это тот случай, когда это решение просто основано на существовании функции «тогда» (самое близкое, что я нашел, это https://developers.google.com/web/fundamentals/primers/promises, который ссылается нак возвращаемому значению как «что-то вроде обещания»).Если это так, то насколько я понимаю, что «затем» как имя функции - это в основном зарезервированное слово в Javascript?Я видел другие реализации Maybe (такие как https://www.npmjs.com/package/data.maybe), в которых для аналогичной вещи используется слово «цепочка» - мне было интересно, почему это так?

Может кто-нибудь пролить свет намой вывод здесь правильный, и если да, то есть ли какой-нибудь обходной путь, который я могу использовать, кроме переименования моей функции?

К вашему сведению, единственный другой ТАК вопрос, который я нашел, который касается этой проблемы, - этот - Решить обещаниес объектом с функцией «then» - но поскольку это зависит от угла, я не верю, что это дублирование.

Заранее спасибо!

1 Ответ

0 голосов
/ 28 декабря 2018

... переменная строки в приведенном выше коде имеет функцию под названием «then».Короче говоря, кажется, что Javascript запутывается и по какой-то причине автоматически вызывает МОЕ "затем" ...

Это не запутано.:-) Это определение того, как работают обещания.Обещания JavaScript работают в соответствии со спецификацией Promises / A + , которая использует следующую терминологию:

1.1 «Обещание» - это объект или функция с методом then, поведение которого соответствуетэта спецификация.

1.2 «thenable» - это объект или функция, которые определяют метод then.

Если у вас есть объект, проходящий через цепочку обещаний, это thenable , но не обещание , оно несовместимо с обещаниями.

Так что да, в некотором смысле, свойство then объектов, проходящих через цепочки обещаний, "зарезервировано"Обещания / A + спец.Вам нужно будет обернуть ваше значение raw в объект, который не имеет then (а затем развернуть его позже).Или, если можете, переименуйте then в своем дизайне, чтобы устранить конфликт.

...