Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
node.js中的异步读取数据库_Node.js_Coffeescript_Q - Fatal编程技术网

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

node.js中的异步读取数据库,node.js,coffeescript,q,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

我正在尝试从本地数据库读取数据,然后在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
我希望从表1获得数据,然后从表2获得数据,以此类推。但是,日志显示表不是按顺序读取的,因此我的服务器有时在没有准备好所有数据的情况下启动

我还尝试了JQDEFERR,结果类似。我做错了什么?如何强制节点按顺序读取表,然后才运行服务器


谢谢

您的方法是以链式方式同步运行它们。将异步的放在一个数组中,“扩散”结果。我不是一个咖啡脚本的家伙,但收集你的承诺阵列

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

,谢谢。然而,我仍然不明白为什么我要按顺序运行它们,正如你所说,但是要以随机顺序获得结果。我对咖啡脚本了解不够,无法帮助你做到这一点,我认为这与cs vs js无关,毕竟cs是以非常直接的方式翻译成js的。不过,谢谢。本质上,您是在调用一个承诺链,其中每一部分都需要在链中的下一步之前完成并提供价值。这是通过“Then”方法实现的,它告诉代码等待函数完成并提供结果,然后继续。通过then将每个sql语句链接在一起意味着前者需要在后者开始之前完成。所有人都接受一系列承诺,并等待它们全部完成,然后再继续前进。