2016-01-27 90 views
2

我使用when.js作爲一個承諾庫,貓鼬,並試圖讓不同的申請收集,並返回結果作爲承諾貓鼬明顯輕諾

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

編輯#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爲其Promise庫使用when.js。如果這與原生承諾一致(並且看似藍鳥和q),則不需要在承諾中包裝查詢,貓鼬會爲您做這件事(一旦您使用exec()),那麼您的代碼可以這樣寫:

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

您可以使用您的agg功能。

由於@robertklep在評論中指出,沒有必要在getPromisedDistinct一個then塊,因爲它是不必要的混亂(見promise anti-patterns,你已經與return $log.distinct...返回承諾對象,然後訪問您的agg函數值。

值得注意到貓鼬的文檔對堵塞的承諾庫:用ES6本土承諾,藍鳥,和q

貓鼬測試,出口的ES6風格的承諾構造應該禾任何承諾庫rk理論上,但理論往往不同於實踐。如果您發現錯誤,請打開一個問題,在GitHub上

+0

我使用'then'對返回的結果,但解析值是承諾的功能 –

+0

還你使用節點,所以如果你在v0.12.x你可以使用原生承諾 – br3w5

+0

'.then(function(keys){return keys;})'是一種反模式:-) – robertklep