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