[英]Using Q promise library with Express.js and Mongoose
我從未使用過Promise,而是使用我編寫的express.js / mongo應用程序來探索它們。 以下是查詢mongo,然后將結果設置為render方法參數(由模板引擎使用)中對象的屬性的路由之一。 我很好奇如何使用Q來以“承諾”的方式編寫代碼。 我擺弄了大約一個小時,決定扔毛巾問問。
app.get("/", function(req, res) {
Comment.find(function(err, item) {
res.render("index", {
comment: item
})
})
})
如果您不堅持必須在q
上完成操作,則可以使用bluebird
並承諾:
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
具有這種簡化方法,因此在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 });
});
});
您將使用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
btw,因為這可能是異步回調,但用於多個事件而不是單個結果。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.