我正在尝试从本地数据库读取数据,然后在我的节点.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
我希望从表 1 获取数据,然后从表 2 中获取数据,依此类推。但是,日志显示表未按顺序读取,因此我的服务器有时会在没有准备好所有数据的情况下启动。
我也尝试使用JQDeferred,结果类似。我做错了什么?如何强制节点按顺序读取表,然后才运行服务器?
谢谢
您的方法是以链式方式同步运行它们。 将异步的放在一个数组中,然后"传播"结果。我不是咖啡脚本的人,但以数组收集您的承诺
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'
})
编辑:错过了所有