2015-03-02 2 views
3

Я использую библиотеку Vogels для взаимодействия с DynamoDb. Amodel ниже модель я определил с помощью vogels.define() и вот фрагмент кода, который я не могу получить работу:Как конвертировать асинхронный вызов в обещание bluebird:

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 
} 

Как включить запрос .exec() в обещание bluebird? С Q я бы просто использовал

q.ninvoke(query, 'exec'). 
+1

'promisifyAll' означает, что вы должны использовать' .execAsync() ' – Bergi

+0

@Bergi Это не сработает, потому что BlueBird добавит функцию' queryAsync' в 'AModel', но после этого мне нужно добавить' .usingIndex ('a-index') 'после запроса. – user3409889

+0

Что значит «после запроса»? Обратите внимание, что я ничего не говорил о '.queryAsync()', но метод 'exec' (который обычно принимает обратный вызов и теперь должен возвращать обещание). – Bergi

ответ

0

Я автор библиотеки Vogels. У меня нет опыта работы с синей птицей, но, надеюсь, поможет. При запуске query.exec(), без обратного вызова, vogels переключится в режим потоковой передачи. Он вернет поток к вызывающему абоненту и только начнет чтение из базы данных, как только считыватель подключится к потоку. Вы можете узнать больше об этом в разделе потоковой передачи в разделе потоковой передачи

С примером вашей синей птицы, вызывающим query.exec без обратного вызова, и с примером Q, ninvoke, скорее всего, вызывает query.exec с обратным вызовом. Я бы посмотрел, есть ли эквивалент ninvoke с bluebird.

+1

Спасибо, я пропустил часть о потоковых API. Я просто вручную конвертировал query.exec в обещание, используя найденную технику [здесь] (http://stackoverflow.com/questions/22519784/how-do-i-convert-an-existing-callback-api-to-promises) – user3409889

+0

Это 'Bluebird.fromCallback (cb => /*...*/)' – Louy

0

Edit: Я взял несколько минут, чтобы опубликовать пакет NPM vogels-promisified

Это должно promisify все:

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