Добавление метода в обещание Bluebird

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

Я хотел бы подойти так же близко / чисто, как следующее:

Model.findAsync().toCustom();

toCustom в основном представляет собой форму toJSON, которая 1) выполняет запрос и 2) настраивает вывод результатов/создает пользовательские ошибки и т. д. довольно просто.

Каков самый чистый способ добиться чего-то подобного вышеизложенному? Я хотел бы избежать этого каждый раз:

Model.findAsync().then(function(docs) {
  return toCustom(docs);
}, function(err) {
  return toCustom(err);
});

Вы поняли идею...


person cyberwombat    schedule 14.02.2015    source источник
comment
Но вы могли бы просто сделать .then(toCustom, toCustom)? (Хотя я не думаю, что это хорошая идея вызывать toCustom для всех ошибок)   -  person Bergi    schedule 14.02.2015


Ответы (1)


Bluebird фактически напрямую поддерживает ваш вариант использования. Если вам нужно опубликовать библиотеку, которая расширяет bluebird по-своему, вы можете получить новую копию bluebird, выполнив следующие действия:

var Promise = require("bluebird/js/main/promise")();
Promise.promisifyAll(require("mongoose")); // promisify with a local copy
Promise.prototype.toCustom = function(){
   return this.then(toCustom, toCustom); // assuming this isn't just `.finally`
};

Вы также можете как-то экспортировать его. Эта функция предназначена для авторов библиотек и для получения изолированной копии bluebird. См. раздел для авторов библиотек в вики.

person Benjamin Gruenbaum    schedule 14.02.2015