【问题标题】:Async-reading databases in node.jsnode.js 中的异步读取数据库
【发布时间】:2015-01-30 15:52:05
【问题描述】:

我正在尝试从本地数据库中读取数据,然后在我的 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,结果相似。我究竟做错了什么?如何强制节点按顺序读取表,然后才运行服务器?

谢谢

【问题讨论】:

    标签: node.js coffeescript q


    【解决方案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

    【讨论】:

    • 这就是诀窍,谢谢。但是我仍然不明白为什么我要按您所说的顺序运行它们,而是按随机顺序获得结果。
    • 对咖啡脚本了解不够,无法帮助您,
    • 我认为这与 cs vs js 无关,毕竟 cs 以一种非常简单的方式翻译成 js。不过,谢谢。
    • 本质上你是在调用一个承诺链,每个部分都需要在链中的下一步之前完成并提供价值。这是通过“Then”方法实现的——它告诉代码等待函数完成并提供结果 THEN 继续。将每个 sql 语句通过 then 链接在一起意味着前者需要在后者开始之前完成。 Q.all 接受一系列承诺,并在继续之前等待它们全部完成。
    猜你喜欢
    • 2021-03-18
    • 2015-06-20
    • 1970-01-01
    • 2011-07-05
    • 1970-01-01
    • 2017-02-21
    • 2014-06-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多