我正在使用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').
答案 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( ... )