2016-05-17 24 views
0

我很難說爲什麼Bluebird的Promise.promisify不是promisifying我的查詢函數,因爲它需要像大多數節點樣式函數一樣的回調。它可能是破壞代碼的Mongoose的aggregation()方法嗎?Bluebird promisify不包裝節點樣式函數

function query(callback) { 
    model.aggregate([{$sort:{a: -1}}], function(err, items) { 
    if (err) { 
     console.log(err); 
    } 
    let mostA = items[0].a; 
    Caller.aggregate([{$sort:{b: -1}}], function(err, items) { 
     if (err) { 
     console.log(err); 
     } 
     let mostB = items[0].b; 
     callback({mostA: mostA, mostB: mostB}); 
    }); 
    }); 
}; 

let most = Promise.promisify(query); 

most() 
.then((data) => { 
    // do something 
}) 
.catch((err) => { 
    console.log('err:', err); // I always get an error. 
}); 
+0

這不是一個節點式的回調??? – Bergi

+1

如果你自己編寫這個函數,你應該提出這些'聚合'方法。 – Bergi

+0

是的,'model.aggregate()'是什麼需要promisified,而不是'query()'。 –

回答

2

這不是節點式回調。節點樣式回調必須執行以下操作:

  1. 回調必須是該方法的最後一個參數(您對該方法很好)。
  2. 回調必須有兩個參數(你不擅長這個)
  3. 的第一個參數回調必須是一個錯誤值,truthy只要有一個錯誤(你不擅長這個)。
  4. 回調函數的第二個參數必須是返回的任何數據(如果有的話)。

此外,您的query()函數不會執行適當的錯誤處理。它需要將錯誤值作爲第一個參數調用回調,然後停止進一步處理。

所以,當你這樣做:

callback({mostA: mostA, mostB: mostB}); 

你告訴回調,有一個錯誤,因爲你正在傳遞的第一個參數爲truthy值。

如果你想讓它正確的形式,你可以這樣做:

callback(null, {mostA: mostA, mostB: mostB}); 
+0

@MichaelL - 這是否回答你的問題?如果是這樣,請點擊答案左邊的綠色複選標記以向社區表明這一點,併爲您在堆棧溢出時遵循適當的過程獲得一些信譽點。如果沒有,請解釋你仍然困惑的部分問題。 – jfriend00