我将项目从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();
};
答案 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")