2013-09-03 4 views
0

После прочтения документации Q у меня создалось впечатление, что следующее будет ждать SELECT, обеспечивая тем самым возможность синхронизации ввода-вывода. Предположим, что db - открытая база данных SQLite.Q обещание и синхронный ввод-вывод

count = 500; 
    Q.invoke(db, 'get', "SELECT * FROM blah blah ...").done(
     function() { --count; }, 
     function() { // error code} 
    ); 
    console.log(count); 

Тестирование показывает, что это не так. Как я могу получить SELECT и его результат, синхронизированный с помощью методологии обещаний, чтобы выход на консоль составлял 499?

Я действительно хочу обернуть это в цикле while, который обрабатывает X количество строк, где любая заданная строка может уменьшить количество на значение, полученное из этой строки. Количество раз в цикле зависит от данных.

ответ

0

без введения нитей или волокон, не представляется возможным сделать асинхронную операцию выглядеть синхронную операцию. Таким образом, вам нужно будет поместить ваш console.log внутри обработчика, который уведомляет вас о завершении операции.

var count = 500; 
Q.invoke(db, 'get', "SELECT * FROM blah blah ...") 
.then(function (results) { 
    for (var i = 0; i < results.length; i++) { 
     var result = results[i]; 
     --count; 
    } 
}) 
.done(); 

Некоторые API баз данных позволят вам передать результаты. Вам нужно будет найти это в документации. В идеале это будет выглядеть так:

var count = 500; 
Q(db) 
.invoke("getStream", "SELECT * FROM blah blah blah") 
.invoke("forEach", function (result) { 
    --count; 
}) 
.then(function() { 
    assert.equals(count, 0); 
}) 
.done(); 
+0

Вы ответили на мой вопрос, заявив категорически, что Q не создаст возможности синхронизации, но то, о чем я не слышал (нити/волокна), будет. Я проверю их. –

0

Граф будет декрементируется асинхронно, так что вы должны напечатать внутри successsfull then обратного вызова:

count = 500; 
Q.invoke(db, 'get', "SELECT * FROM blah blah ...").then(
    function() { --count; console.log(count); }, 
    function() { // error code} 
); 

Вы не можете положить, что в петлю, а обещания не сделает ваш код синхронно каким-либо образом , Я думаю, что вы действительно ищете это пообещать/комбо-генераторы:

Q.async(function*() { 
    var count = 0; 
    // Notice the regular loop here 
    while (count > 0) { 
    count -= yield Q.invoke(db, 'get', 'SELECT * FROM blah blah ...'); 
    console.log(count); 
    } 
}); 

Обратите внимание два новых конструкций здесь: yield ключевых слов и function* декларации. Они обрабатываются для ECMAScript 6.

Если вы используете Node.js, вы можете попробовать их сегодня. Просто запустите узел с флагом гармонии:

$ node --harmony --harmony-generators script.js 
+0

Немного слишком футуристический для меня прямо сейчас. Я работаю над приложением Chrome и должен оставаться в пределах того, что он поддерживает сегодня. Я также предпочитаю, чтобы новые вещи старели до того, как я их использую в производственном коде. Я новичок в JS, и я все еще изучаю его основные функции. Даже не дошли до популярных библиотек, таких как JQuery. Спасибо за то, что наступит. –

Смежные вопросы