如何将异步调用转换为bluebird-promise:



我正在使用Vogels库与DynamoDb交互。下面的AModel是我使用vogels.define()定义的模型,这里有一段我无法使用的代码:

var Promise = require('bluebird')
Promise.promisifyAll(AModel);
var query = AModel
            .query(1)
            .usingIndex('a-index')
Promise.resolve(query.exec()).then(
function(output) {
    console.log(output)
})

输出为:

{
  "_readableState": {
    "highWaterMark": 16384,
    "buffer": [],
    "length": 0,
    "pipes": null,
    "pipesCount": 0,
    "flowing": false,
    "ended": false,
    "endEmitted": false,
    "reading": false,
    "calledRead": false,
    "sync": true,
    "needReadable": false,
    "emittedReadable": false,
    "readableListening": false,
    "objectMode": true,
    "defaultEncoding": "utf8",
    "ranOut": false,
    "awaitDrain": 0,
    "readingMore": false,
    "decoder": null,
    "encoding": null
  },
  "readable": true,
  "domain": null,
  "_events": {},
  "_maxListeners": 10
}

如何将query.exec()转换为bluebird promise?对于Q,我只会使用

q.ninvoke(query, 'exec').

我是Vogels图书馆的作者。我对蓝鸟没有任何经验,但希望能帮上忙。当运行query.exec()时,如果没有传入回调,vogels将切换到流模式。它将向调用方返回一个流,并且只有在读取器连接到流后才开始从数据库中读取。你可以在自述的流媒体部分阅读更多关于它的信息

在您的bluebird示例中,它在没有回调的情况下调用query.exec,而在Q示例中,ninvoke很可能在有回调的情况中调用query.eexec。我想看看是否有一个与蓝鸟相当的忍者。

编辑:我花了几分钟时间发布了一个npm包vogels promised

这应该承诺一切:

var Promise = require("bluebird");
var vogels = require("vogels");
Promise.promisifyAll(require('vogels/lib/table').prototype);
Promise.promisifyAll(require('vogels/lib/item').prototype);
Promise.promisifyAll(require('vogels/lib/query').prototype);
Promise.promisifyAll(require('vogels/lib/scan').prototype);
Promise.promisifyAll(require('vogels/lib/parallelScan').prototype);
var vogels_model = vogels.model;
vogels.model = function(name, model){
  if (model) { Promise.promisifyAll(model); }
  return vogels_model.apply(vogels, arguments);
};

然后你可以做这样的事情:

AModel
  .query(1)
  .usingIndex('a-index')
  .execAsync()
  .then( ... )

另请参阅问题:添加承诺支持

相关内容

  • 没有找到相关文章

最新更新