Q.ninvoke替换节点bluebird

时间:2015-01-26 10:44:38

标签: node.js mongoose promise q bluebird

我将项目从Q迁移到蓝鸟。 在这个项目中,Q.invoke使用了很多。

e.g。在这样的中心方法:

repo.count = function(entity,query)  { // entity is a mongoose model
    var command = query = entity.find(query).count();
    return Q.ninvoke(command, 'exec');
};

重构这段代码并返回相同的#34; kind"最好的蓝鸟方式是什么?承诺? 阅读蓝鸟文档,似乎promisifyAll似乎是正确的方向。现在我有这个工作,但使呼叫阻止:

repo.count = function*(entity,query)  {
    entity = bluebird.promisifyAll(entity); // this needs to be moved somewhere central
    return yield entity.find(query).count();
};

2 个答案:

答案 0 :(得分:2)

嗯,你可以做几件事。最明显的是,#34;没什么"。

当你没有通过执行其回调时,Mongoose已经返回Promises / A +承诺,你可以同化它们:

repo.count = function(entity,query)  { // entity is a mongoose model
    return entity.find(query).count().exec(); // return promise
};

你可以放心地将这个承诺与蓝鸟一起使用,这将很乐意吸收它:

Promise.resolve(repo.count(e, q)); // convert to bluebird promise explicitly

someOtherBBPromise.then(function(query){
    return repo.count(entity, query); // `then`able assimilation
});

也就是说,可能希望蓝鸟承诺全部。对于这个蓝鸟有一个非常强大的promisifyAll,可以让你立刻宣传猫鼬:

var Promise = require("bluebird");
var mongoose = Promise.promisifyAll(require("mongoose"));
// everything on mongoose promisified 
someEntity.saveAsync(); // exists and returns bluebird promise

答案 1 :(得分:2)

我来自谷歌,接受的答案不是我想要的。我正在寻找ninvoke的一般替代品。

看起来应该是这样的。

Q版:

Q.ninvoke(redisClient, "get", "foo")

蓝鸟版:

Promise.promisify(redisClient.get, {context: redisClient})("foo")