node.js中的异步读取数据库

时间:2014-12-02 11:52:47

标签: node.js coffeescript q

我正在尝试从本地数据库读取数据,然后在node.js服务器中使用此数据。我正在使用mssql包进行查询。

但是,由于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

我希望从table1获取数据,然后从table2获取数据,依此类推。但是,日志显示表没有按顺序读取,因此我的服务器有时会在没有准备好所有数据的情况下启动。

我也尝试过使用类似结果的JQDeferred。我究竟做错了什么?如何强制节点按顺序读取表,然后才运行服务器?

由于

1 个答案:

答案 0 :(得分: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' 
})

编辑:错过了q.all