Мангуст отличается обещаниями
Я использую когда.js в качестве библиотеки обещаний для mongoose и пытаюсь получить отдельное поле коллекции и вернуть результат в качестве обещания
mongoose.Promise= require("when");
function getPromisedDistinct(startDate, endDate) {
return when.promise(function(resolve, reject) {
$log.distinct("keys", {
datetime: {
"$gte": startDate,
"$lt": endDate
}
}).exec()
.then(function(res) {
return resolve(res);
});
});
}
однако getPromisedDistinct разрешается с помощью функции обещания
function (resolve, reject) {
if (!_this.op) {
callback && callback(null, undefined);
resolve();
return;
}
_this[_this.op].call(_this, function(error, res) {
if (error) {
callback && callback(error);
reject(error);
return;
}
callback && callback.apply(null, arguments);
resolve(res);
});
}
edit #1 getPromisedDistinct называется как
function agg(day, startDate, endDate) {
return when.promise(function(resolve, reject) {
getPromisedDistinct(startDate, endDate).then(function(keys) {
log.data("keys is : \n" + licence_keys);
}).otherwise(function(keys) {
return reject(err);
});
});
}
почему это не разрешено оценивать?
1 ответ
Вы поручили Mongoose использовать когда.js для его библиотеки Promise. Если это работает так же, как и с собственными обещаниями (и, по-видимому, bluebird и q), вам не нужно заключать запросы в обещание, mongoose сделает это за вас (как только вы используете exec()
) чтобы ваш код мог быть написан так:
function getPromisedDistinct(startDate, endDate) {
return $log.distinct("keys", {
datetime: {
"$gte": startDate,
"$lt": endDate
}
}).exec()
});
}
Вы можете сделать то же самое с вашим agg
функция.
Как отметил @robertklep в комментариях, нет необходимости включать then
блокировать в getPromisedDistinct
потому что это ненужный беспорядок (см. анти-паттерны обещания. Вы уже возвращаете объект обещания с return $log.distinct...
а затем доступ к этому значению в вашем agg
функция.
Стоит обратить внимание на документацию Mongoose по подключению библиотеки обещаний:
Мангуста тестирует с собственными обещаниями ES6, bluebird и q. Любая библиотека обещаний, которая экспортирует конструктор обещаний в стиле ES6, должна работать теоретически, но теория часто отличается от практики. Если вы нашли ошибку, откройте проблему на GitHub