В экосистеме программирования важно знать свои соглашения. Я работал с пакетом Bluebird, чтобы обещать асинхронные обратные вызовы.

Я новичок в NodeJS. Пользуюсь им только последние два месяца. Поэтому я не могу по-настоящему оценить, как тяжело должно было быть разработчикам, прежде чем обещания стали стандартом в среде. Я уже ненавижу обратные вызовы и пока даже не зарабатываю этим на жизнь. Я не могу представить, что мне придется снова и снова кодировать обратные вызовы внутри обратных вызовов. Есть причина, по которой это называют адом обратных вызовов.

Код тревожный. Достаточно сложно написать полезные вложенные обратные вызовы, можете ли вы представить, как придете позже и попытаетесь поддержать этого монстра? Фу.

К счастью, у нас есть замечательный npm-пакет Bluebird для обертывания асинхронных обратных вызовов в промисы, которые позволяют async await.

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

Недавно я обещал создать целую библиотеку, не понимая, что библиотека не беспокоится о том, чтобы в своих обратных вызовах содержался аргумент об ошибке. Поэтому всякий раз, когда обратный вызов отправляет только один аргумент, Bluebird предполагает, что он отправляет обратно ошибку.

Вы можете представить мое разочарование, когда точный результат, который я хотел, был заключен в сообщение об ошибке.

К счастью, вы можете определять свои собственные обещания в Bluebird. Все, что вам нужно сделать, это написать одну оболочку обещания для функций из библиотеки, которую вы хотите использовать, на этот раз убедившись, что функции разрешаются с помощью второго аргумента. С этого момента Bluebird сможет работать со всеми асинхронными методами обратного вызова и правильно преобразовывать их в асинхронные функции, добавляя постфикс «Async» к имени метода.

var Promise = require('bluebird');

/*The custom promisifier is only necessary if the library does not follow the standard convention of error first callbacks */
const someLibrary = Promise.promisifyAll(require('someLibrary'), {
    promisifier: function(fn) {
        return function(...args) {
            return new Promise(resolve => {
                args.push(resolve);
                fn.apply(this, args);
            });
        }
    }
});
/* after this code someLibrary.method(err, callback) now has a duplicate version that returns a promise, so this is possible */
let variable = await someLibrary.methodAsync();

После того, как явно определенный промисификатор вручную помещает значение разрешения обещания в аргументы метода. Теперь у Bluebird есть второй аргумент для выполнения поиска разрешенного значения, поэтому он может нормально продолжить преобразование методов библиотеки в стиль Async.

Код для настраиваемого промисификатора взят из этой проблемы Github, где соавтор Bluebird объясняет свои аргументы и предлагает код (они допустили опечатку, написав «промисифер» вместо «промисификатор», поэтому не делайте точную копирование и вставку).



Обещание функций, не следуя соглашению« сначала ошибка · Проблема № 974 · petkaantonov…
Собственные модули Node включают функции, которые выполняют обратный вызов напрямую с результатом, например вопрос readline. Как это… github.com »