2014-12-02 5 views
0

Я пытаюсь прочитать данные из локальной базы данных, а затем использовать эти данные на моем сервере node.js. Я использую пакет mssql для запросов.Асинхронные базы данных в node.js

Однако, поскольку mssql считывает данные асинхронно, я хочу убедиться, что данные готовы до запуска сервера. Я пытался создать обещания следующим образом, с пакетом Q:

# v is the variable to populate with data 
callSql = (v,db,table) -> 
    d = Q.defer() 

    sql.connect cfg, (err) -> 

    request = new sql.Request() 
    request.query "select * from " + table, (err, data) -> 
     data.forEach (row) -> 
      v.push row 
     console.log "Read "+ table 
     d.resolve data 

    d.promise 

Затем я стараюсь читать данные из нескольких таблиц и продолжить, чтобы запустить сервер, как это делается:

callSql var1, con1, table1 
.then callSql var2, con2, table2 
.then callSql var3, con1, table3 
.then -> console.log 'start server' #etc 

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

Я также пробовал с JQDeferred с аналогичными результатами. Что я делаю не так? Как я могу заставить узел читать таблицы последовательно и только затем запустить сервер?

Благодаря

ответ

1

Ваш подход работает их синхронно, в связанной форме. Поместите асинхронные в массив и «разбросайте» результаты. Я не парень кофе сценарий, но собирать свои обещания в массиве

var promises =[ 
    callSql(var1, con1, table1) 
    , callSql(var2, con2, table2) 
    , callSql(var3, con3, table3) 
] 

Q.all(promises).spread(function(results1, results2 results3){ 
console.log 'start server' 
}) 

Edit: пропустил q.all

+0

Это делает трюк, спасибо. Но я до сих пор не понимаю, почему я, как вы говорите, управлял ими последовательно, но получал результаты в случайном порядке. – legrojan

+0

не знаю достаточно о скрипте кофе, чтобы помочь вам там, – akaphenom

+0

Я не думаю, что это связано с cs vs js, ведь cs переводится в js довольно просто. Тем не менее, спасибо. – legrojan

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