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

时间:2015-03-02 01:17:25

标签: node.js promise q bluebird

我正在使用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()转换为蓝鸟承诺?有了Q,我只想用

q.ninvoke(query, 'exec').

2 个答案:

答案 0 :(得分:0)

我是Vogels图书馆的作者。我对蓝鸟没有任何经验,但希望有所帮助。运行query.exec()时,如果没有传入回调,vogels将切换到流模式。它将向调用者返回一个流,并且只有在读取器连接到流后才会从数据库开始读取。您可以在readme

的流媒体部分详细了解相关信息

使用你的bluebird示例调用没有回调的query.exec,并且使用Q示例ninvoke最有可能通过回调调用query.exec。我会看看是否有与蓝鸟相当的ninvoke。

答案 1 :(得分:0)

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

这应该是所有事情的承诺:

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( ... )

另见Issue: Add promise support