Q.ninvoke 节点 bluebird 中的替换
Q.ninvoke replacement in node bluebird
我正在将一个项目从 Q 迁移到 bluebird。
在这个项目中 Q.invoke 被大量使用。
例如在这样的中央方法中:
repo.count = function(entity,query) { // entity is a mongoose model
var command = query = entity.find(query).count();
return Q.ninvoke(command, 'exec');
};
重构此代码并返回相同 "kind" 承诺的最佳蓝鸟方法是什么?
阅读蓝鸟文档,似乎 promisifyAll 似乎是正确方向的重点。现在我有这个可以用,但是会阻塞调用:
repo.count = function*(entity,query) {
entity = bluebird.promisifyAll(entity); // this needs to be moved somewhere central
return yield entity.find(query).count();
};
好吧,您可以做几件事。最明显的是令人惊讶的 "nothing".
Mongoose 已经 returns Promises/A+ 承诺当你不传递 exec 它的回调时,你可以吸收它们:
repo.count = function(entity,query) { // entity is a mongoose model
return entity.find(query).count().exec(); // return promise
};
您可以安全地将承诺与 Bluebird 一起使用,它会很乐意吸收它:
Promise.resolve(repo.count(e, q)); // convert to bluebird promise explicitly
someOtherBBPromise.then(function(query){
return repo.count(entity, query); // `then`able assimilation
});
就是说,蓝鸟承诺全面化可能是可取的。因为这个 bluebird 有一个非常健壮的 promisifyAll
可以让你立刻 promisify mongoose:
var Promise = require("bluebird");
var mongoose = Promise.promisifyAll(require("mongoose"));
// everything on mongoose promisified
someEntity.saveAsync(); // exists and returns bluebird promise
我来自google,接受的答案不是我想要的。我正在寻找 ninvoke
.
的通用替代品
它应该看起来像这样。
Q版:
Q.ninvoke(redisClient, "get", "foo")
蓝鸟版本:
Promise.promisify(redisClient.get, {context: redisClient})("foo")
我正在将一个项目从 Q 迁移到 bluebird。 在这个项目中 Q.invoke 被大量使用。
例如在这样的中央方法中:
repo.count = function(entity,query) { // entity is a mongoose model
var command = query = entity.find(query).count();
return Q.ninvoke(command, 'exec');
};
重构此代码并返回相同 "kind" 承诺的最佳蓝鸟方法是什么? 阅读蓝鸟文档,似乎 promisifyAll 似乎是正确方向的重点。现在我有这个可以用,但是会阻塞调用:
repo.count = function*(entity,query) {
entity = bluebird.promisifyAll(entity); // this needs to be moved somewhere central
return yield entity.find(query).count();
};
好吧,您可以做几件事。最明显的是令人惊讶的 "nothing".
Mongoose 已经 returns Promises/A+ 承诺当你不传递 exec 它的回调时,你可以吸收它们:
repo.count = function(entity,query) { // entity is a mongoose model
return entity.find(query).count().exec(); // return promise
};
您可以安全地将承诺与 Bluebird 一起使用,它会很乐意吸收它:
Promise.resolve(repo.count(e, q)); // convert to bluebird promise explicitly
someOtherBBPromise.then(function(query){
return repo.count(entity, query); // `then`able assimilation
});
就是说,蓝鸟承诺全面化可能是可取的。因为这个 bluebird 有一个非常健壮的 promisifyAll
可以让你立刻 promisify mongoose:
var Promise = require("bluebird");
var mongoose = Promise.promisifyAll(require("mongoose"));
// everything on mongoose promisified
someEntity.saveAsync(); // exists and returns bluebird promise
我来自google,接受的答案不是我想要的。我正在寻找 ninvoke
.
它应该看起来像这样。
Q版:
Q.ninvoke(redisClient, "get", "foo")
蓝鸟版本:
Promise.promisify(redisClient.get, {context: redisClient})("foo")