У меня есть плагин Mongoose, который в настоящее время поддерживает только обратные вызовы, я планирую, возможно, опубликовать его в npmjs, но сначала я хотел убедиться, что он работает так же, как существующие функции/методы Mongoose, которые поддерживают обратные вызовы и некоторые встроенные промисы, а также вы можете указать собственную библиотеку промисов.
Я хотел знать, как лучше всего реализовать ту же функциональность в моей библиотеке, то есть как я могу поддерживать как обратные вызовы , так и обещания? Я нашел похожий поток SO, но это специфично для bluebird, который, хотя мне нравится использовать, я не хотел бы предполагать, что он будет использоваться. (Кроме того, эта статья выглядит устаревшей, так как я не смог найти nodeify
в bluebird документы API
Я думал, что могу просто выполнить некоторую базовую логику, чтобы увидеть, была ли функция предоставлена в качестве одного из параметров, если да, то выполнить обратный вызов, если нет, то вернуть обещание... но я уверен, что есть более простой способ сделать это.
Кроме того, для промисов, когда я делаю возвращаю промис, должен ли я использовать Promise
внутри объекта Mongoose
, переданного плагинам? Имея в виду:
module.exports = Mongoose => {
// Just verifying, should I use this?..
const Promise = Mongoose.Promise
return Mongoose.model( 'Foobar', new Mongoose.Schema({ /* ... */ }) )
}
Обновлять
Что касается последнего вопроса, о том, на какой объект Promise ссылаться при возврате обещаний, я попытался использовать Mongoose.Promise
, как указано выше, код ниже:
module.exports = Mongoose => {
const Promise = Mongoose.Promise
const Schema = Mongoose.Schema
const fooSchema = new Schema({
name: Schema.Types.String
})
fooSchema.statics.blah = function( ) {
// Return Mongoose.Promise
return new Promise( ( res, rej ) => {
res( 'test' )
})
}
return Mongoose.model( 'Foobar', fooSchema )
}
... Что привело к ошибке:
/Users/me/project/node_modules/mongoose/lib/ES6Promise.js:21
throw 'Can\'t use ES6 promise with mpromise style constructor';
^
Can't use ES6 promise with mpromise style constructor
Итак, я предполагаю, что это неправильный путь... Я подумал, что было бы лучше возвращать обещания, используя ту же библиотеку обещаний, которую настроил Mongoose (Custom или по умолчанию..)
Я попытался увидеть, как это делает Mongoose, посмотрев на код функции findOne, но я не совсем понимаю, как она возвращает обещание, если не указан обратный вызов PS Я использую Mongoose 4.3.7
Обновлять
Просто возился, но будет ли это приемлемым методом? Или это плохая практика
function tester(foo, cb){
return new Promise( ( res, rej ) => {
const result = 'You said ' + foo
if( typeof cb === 'function' ){
cb( null, result )
res() // Is this needed?
}
else {
res( result )
}
})
}
tester('foo', (err, data) => {
if( err )
console.log('ERROR!',err)
else
console.log('Result:',data)
})
tester('bar')
.then( data => {
console.log('Result:',data)
})
.catch( err => {
console.log('ERROR!',err)
})