Javascript 如何使用Bluebird在构建的构造函数上演示导出的函数;“类”;

Javascript 如何使用Bluebird在构建的构造函数上演示导出的函数;“类”;,javascript,promise,bluebird,Javascript,Promise,Bluebird,我有一个服务,PageService,我这样测试(简化) 我一直在努力使用bluebird来实现所有挂起PageService的方法(getAll、getById、create、update、delete等)。我已经看过关于这个主题的几次讨论,但大多数讨论似乎都关注如何让构造函数返回一个承诺。我只想说明我通过构造函数创建的类上挂起的所有函数。这是pageService=新的pageService(数据库);我无法通过承诺 PageService只是使用一个基本的构造函数模式——例如 self.g

我有一个服务,PageService,我这样测试(简化)

我一直在努力使用bluebird来实现所有挂起PageService的方法(getAll、getById、create、update、delete等)。我已经看过关于这个主题的几次讨论,但大多数讨论似乎都关注如何让构造函数返回一个承诺。我只想说明我通过构造函数创建的类上挂起的所有函数。这是pageService=新的pageService(数据库);我无法通过承诺

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);

。。。但是,每次我新创建一个服务实例时,通过Promission运行这似乎是一种糟糕的做法。我想用一种方法来保证一次,而且只有一次。我知道在服务中手动返回承诺可能是解决方案,但我希望通过bluebird magic获得更优雅的服务。

你不应该每次都担心承诺。它所做的只是用适当的承诺代码包装回调。我们不需要担心性能问题,这是一个完全可以接受的解决方案

此外,没有其他方法可以做到这一点。这一切归结为两种解决方案:使用
Bluebird
promisification
或手动重写您的服务以使用
承诺
页面服务模块:

function PageService(collection) {
    this.collection = collection;
}
PageService.prototype.getAll = function(next) {
    this.collection.find({}, function(err, docs) {
        if (err) return next(err);
        next(null, docs);
    });
};

module.exports = PageService;
测试模块

var should = require("should");
var Promise = require("bluebird");
var database = { // mockup
    find: function (options, next) {
        next(null, ['the', 'list', 'of', 'docs']);
    }
};
var PageService = require("./PageService");

Promise.promisifyAll(PageService.prototype);

describe("PageService", function () {
    var pageService;

    before(function () {
        pageService = new PageService(database);
    });

    it("can get all pages", function () {
        return pageService.getAllAsync()
        .then(function (pages) {
            pages.should.be.instanceOf(Array);
            pages.length.should.be.greaterThan(1);
        });
    });
});

当你需要它时,只需
promisifyAll
it一次(在需要它之后立即):)这实际上是不正确的,蓝鸟promisification产生了一个非常快的函数,但它本身不是非常快(因为它通过创建一个新函数和
函数
对其进行优化,从而进行了相当积极的优化)。对于速度较慢但开销较小的Promission,有
承诺。fromNode
@BenjaminGruenbaum什么是不正确的?你是说有一个性能处罚值得关注吗?是的,不要一再承诺。在
require
之后承诺一次。好的,我没注意到他是在代码中做的,而不是在
require
中。谢谢。这是“PageService.prototype.getAll=function(next){”与我的“self.getAll=function(next){”函数声明这就是问题所在。关于javascript,我还有很多东西要学。@TimHardy是的,基本上是这样。当您执行
self.getAll=…
,然后在每个实例上创建该方法的新副本。因此,您必须对每个实例进行promisify。
var should = require("should");
var Promise = require("bluebird");
var database = { // mockup
    find: function (options, next) {
        next(null, ['the', 'list', 'of', 'docs']);
    }
};
var PageService = require("./PageService");

Promise.promisifyAll(PageService.prototype);

describe("PageService", function () {
    var pageService;

    before(function () {
        pageService = new PageService(database);
    });

    it("can get all pages", function () {
        return pageService.getAllAsync()
        .then(function (pages) {
            pages.should.be.instanceOf(Array);
            pages.length.should.be.greaterThan(1);
        });
    });
});