gpt4 book ai didi

javascript - 如何使用 Bluebird 在构造函数构建的 "class"上 promise 导出的函数

转载 作者:数据小太阳 更新时间:2023-10-29 04:45:54 28 4
gpt4 key购买 nike

我有一个服务,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 来 promisify 挂起 PageService 的所有方法(getAll、getById、创建、更新、删除等)。我看过关于该主题的几个讨论,但大多数似乎都与试图让构造函数返回一个 promise 有关。我只想 promise 所有卡在我通过构造函数创建的类之外的函数。这是 pageService = new PageService(database);我无法通过 promisification。

PageService 仅使用基本的构造函数模式 - 例如

self.getAll = function(next) {
self.collection.find({}, function(err, docs) {
if (err) return next(err);

next(null, docs);
});
};

如果有人能告诉我正确的方法来轻松地 promisify 从构造函数返回的对象上挂起的所有函数,我将不胜感激。我也对我可能以错误的方式做这件事持开放态度。我对一般的 promise 还很陌生,欢迎指导。

更新

我通过执行以下操作获得了 promise 的功能......

pageService = new PageService(database);
Promise.promisifyAll(pageService);

...但是每次我新建一个服务实例时,通过 promisification 运行似乎是一种不好的做法。我想要一种只 promise 一次的方法。我认识到在服务中手动返回 promise 可能是解决方案,但我希望通过 Bluebird 魔法获得更优雅的东西。

最佳答案

页面服务模块:

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

关于javascript - 如何使用 Bluebird 在构造函数构建的 "class"上 promise 导出的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31623299/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com