2

私はmongooseのpromiseライブラリとしてwhen.jsを使用し、コレクションの個別のフィールドを取得して結果をpromiseとして返すようにしています

 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 は promise 関数で解決されます

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);
    });
  }

編集 #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);
        });
    });
}

なぜこれが値に解決されないのですか?

4

1 に答える 1

1

Promise ライブラリに when.js を使用するように Mongoose に指示しました。これがネイティブの promise (および一見 bluebird と q) と同じように機能する場合、クエリを promise でラップする必要はありませんexec()

function getPromisedDistinct(startDate, endDate) {
    return $log.distinct("keys", {
                datetime: {
                    "$gte": startDate,
                    "$lt": endDate
                }
            }).exec()
    });
 }

関数でも同じことができますagg

@robertklep がコメントで指摘したように、不要な混乱であるため、thenブロックを含める必要はありません ( promise anti-patternsを参照してください。すでに promise オブジェクトを返し、関数でその値にアクセスしています。getPromisedDistinctreturn $log.distinct...agg

promises ライブラリのプラグインに関する Mongoose のドキュメントに注意する価値があります。

ES6 ネイティブ promise、bluebird、および q を使用した Mongoose テスト。ES6 スタイルの promise コンストラクターをエクスポートする promise ライブラリは理論上は機能するはずですが、理論は実際とは異なることがよくあります。バグを見つけた場合は、GitHub でイシューを開いてください

于 2016-01-27T15:59:21.313 に答える