如果你沒有持久性,它必須建立在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 });
});
});
你會想要閱讀https://github.com/kriskowal/q/wiki/API-Reference#interfacing-with-nodejs-callbacks :-)順便說一句,延遲是不推薦的,你應該使用'Q. Promise'構造函數。 – Bergi
@Bergi,謝謝你的支持,真相告訴我,我對bluebird/q promise沒有多少經驗,我很好奇爲什麼'deferred'在各處都被棄用,我知道bluebird也是如此,對於[mozilla]也是如此(https://developer.mozilla.org/en-US/docs/Mozilla/JavaScript_code_modules/Promise.jsm/Deferred)顯然,但無法找到原因爲什麼 – mido
基本上因爲揭示構造函數模式有一個更好,conciser語法(不需要額外的'deferred'變量),並且捕獲解析器回調中的異常。 – Bergi