我正在使用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( ... )
另请参阅问题:添加承诺支持