Мангуст отличается обещаниями

Я использую когда.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

Другие вопросы по тегам