Примечание: Q имеет встроенную версию ниже, поэтому, если вы используете Q (как OP), см. Bergi's answer. Если вы используете другое обещание lib, смотрите, если это произойдет; если нет, см. ниже.
Вы можете дать себе функцию полезности, которая оборачивает вызовы Node-стиль и превращает их в обещаниях (но продолжайте чтение), так:
count: function() {
return makePromise(User.count)
}
makePromise
будет выглядеть что-то вроде
function makePromise(f) {
var deferred = Q.defer()
var args = Array.prototype.slice.call(arguments)
args[0] = function(err) {
if(err)
deferred.reject(err)
else
deferred.resolve(Array.prototype.slice.call(arguments, 1))
}
f.apply(null, args)
return deferred.promise
}
(Я стараюсь следовать вашему соглашению о выходе ;
, который ASI исправит)
Это вызывает функцию, которую вы дали ей, передавая любые дальнейшие аргументы, и когда она получает ответ, либо отклоняет обещание, используя err
, либо разрешает его с использованием массива аргументов, полученных им после err
. Может использоваться со всеми функциями типа Node, вызывающими их обратные вызовы с err
в качестве первого аргумента.
Но, кто-то уже сделал это для вас: promisify
:-) Я уверен, что есть, по крайней мере, еще один.
Несколько более сложный вариант будет поддерживать при необходимости давая thisArg
фронт:
function makePromise(obj, f) {
var deferred = Q.defer()
var args, func, thisArg;
if (typeof obj === "function") {
thisArg = null
func = obj
args = Array.prototype.slice.call(arguments)
} else {
thisArg = obj
func = f
args = Array.prototype.slice.call(arguments, 1)
}
args[0] = function(err) {
if(err)
deferred.reject(err)
else
deferred.resolve(Array.prototype.slice.call(arguments, 1))
}
func.apply(thisArg, args)
return deferred.promise
}
Тогда, если User.count
должна быть вызвана с this
= User
:
count: function() {
return makePromise(User, User.count)
}
Вы можете предоставить образец 'User.count' и' User.find'? – Grundy
@Grundy, я использую mongoose, поэтому они являются стандартными методами модели mongoose. – Rahul
похоже на мангустский инструмент, используя обещания: http://mongoosejs.com/docs/api.html#promise_Promise – Grundy