【发布时间】:2015-10-15 21:07:13
【问题描述】:
我有一个服务,PageService,我像这样测试(简化)...
var database = require("../database/database");
var PageService = require("./pageService");
describe("PageService", function () {
var pageService = {};
before(function (done) {
pageService = new PageService(database);
}
it("can get all Pages", function (done) {
pageService.getAll(function (err, pages) {
if (err) return done(err);
pages.should.be.instanceOf(Array);
pages.length.should.be.greaterThan(1);
done();
});
});
我一直在努力使用 bluebird 来承诺所有挂在 PageService 上的方法(getAll、getById、create、update、delete 等)。我看过几个关于这个主题的讨论,但大多数似乎都关心试图让构造函数返回一个承诺。我只想承诺所有挂在我通过构造函数创建的类的函数。这是 pageService = new PageService(database);我不能因为承诺而过去。
PageService 只是使用基本的构造函数模式 - 例如
self.getAll = function(next) {
self.collection.find({}, function(err, docs) {
if (err) return next(err);
next(null, docs);
});
};
如果有人能告诉我正确的方法来轻松地承诺所有挂在从构造函数返回的对象上的函数,我将不胜感激。我也对我可能以错误的方式做这件事持开放态度。我对一般的承诺很陌生,欢迎指导。
更新
我通过执行以下操作获得了承诺的功能...
pageService = new PageService(database);
Promise.promisifyAll(pageService);
...但是每次我新建一个服务实例时都通过承诺来运行似乎是一种不好的做法。我想要一种承诺一次且仅一次的方式。我认识到在服务中手动返回 Promise 可能是解决方案,但希望通过 bluebird 魔法获得更优雅的东西。
【问题讨论】:
-
当你
require它时只需promisifyAll它一次(在需要它之后立即):)
标签: javascript promise bluebird