2015-07-28 89 views
0

我從來沒有使用promises,並且正在使用我寫的express.js/mongo應用程序來探索它們。下面是查詢mongo的路線之一,然後將結果設置爲render方法參數中的對象的屬性(供模板引擎使用)。 我很好奇如何在「承諾」風格using Q中編寫此代碼。我已經擺弄了大約一個小時,並決定拋出毛巾並問。在Express.js和Mongoose中使用Q promise庫

app.get("/", function(req, res) { 
    Comment.find(function(err, item) { 

     res.render("index", { 
      comment: item 

     }) 
    }) 
}) 

回答

0

如果你沒有持久性,它必須建立在q做,你可以使用bluebird和promisify:

var Promise = require("bluebird"); 
Promise.promisifyAll(Comment); 

app.get("/", function(req, res) { 
    Comment.find() // now this is already a promisified method 
     .then(function(item){ 
      res.render("index", { comment: item }); 
     }).catch(function(err){ 
      res.render('error', { error: err }); 
     }); 
}); 

我不認爲q有這樣promisification的方法,因此,在Q使用deferred

var Q = require("q"); 
app.get("/", function(req, res) { 

    var deferred = Q.defer(); 
    Comment.find(function(err, item) { 
     if(err) return deferred.reject(error); 
     deferred.resolve(item); 
    }); 

    deferred.promise 
     .then(function(item){ 
      res.render("index", { comment: item }); 
     }).catch(function(err){ 
      res.render('error', { error: err }); 
     }); 
}); 
+0

你會想要閱讀https://github.com/kriskowal/q/wiki/API-Reference#interfacing-with-nodejs-callbacks :-)順便說一句,延遲是不推薦的,你應該使用'Q. Promise'構造函數。 – Bergi

+0

@Bergi,謝謝你的支持,真相告訴我,我對bluebird/q promise沒有多少經驗,我很好奇爲什麼'deferred'在各處都被棄用,我知道bluebird也是如此,對於[mozilla]也是如此(https://developer.mozilla.org/en-US/docs/Mozilla/JavaScript_code_modules/Promise.jsm/Deferred)顯然,但無法找到原因爲什麼 – mido

+1

基本上因爲揭示構造函數模式有一個更好,conciser語法(不需要額外的'deferred'變量),並且捕獲解析器回調中的異常。 – Bergi

0

你會使用Q.ninvoke獲得了item承諾:

var itemPromise = Q.ninvoke(Comment, "find"); 

現在你可以鏈接一個.then到 - 基本上將兩個回調:

itemPromise.then(function(item) { 
    // success case 
    res.render("index", { 
     comment: item 
    }); 
}, function(err) { 
    // error case 
    res.render("index", { 
     comment: undefined // reflecting your original code, but hardly what you want 
    }); 
}); 

在這種情況下,承諾不會有很多的優勢。你不能將它們用於app.get順便說一句,因爲這可能是一個異步回調,但對於多個事件而不是單個結果。