如何在节点js的循环中查询SQL

时间:2017-09-13 10:02:31

标签: javascript node.js asynchronous promise

情景: 使用mssql我连接到sql并检索id列表,然后基于那些我想运行存储过程的id。我目前正在做的是运行第一个存储过程,将id存储在一个数组中,然后我运行一个for循环调用另一个模块,在那里我传递id来运行一个存储过程。当我有一个id时,这种方法很好,但是在全局连接已经存在的情况下失败了。首先调用sql.close()。'当我尝试运行多个时。

如何创建连接到sql,运行我的查询,然后运行下一个?什么是最好的方法?

下面的代码使用ids运行存储过程并导致上述错误。

exports.runStoredProc = function (query,id) {
    sql.connect(config.config).then(()=>{
        return sql.query`${query} ${id}`
      }).then(res=> {
        do something with the response    
      }).catch(error => {
        console.log(error)
    })
}

当下面的代码使用下一个id运行它时,看起来连接仍然存在。我认为创建一个Promise会强制等待执行再次运行上面的代码之前?

let toRun = result.recordset.length
let gen = async num => {
  for(let i=0;i<num;i++) {
    var resp = result.recordset[i].id
    console.log(i, resp)
    var sp = report
    var reportId = await new Promise(() => db.runStoredProc(sp,resp))
  }        
}
gen(toRun).then(() => console.log("done!"))

1 个答案:

答案 0 :(得分:0)

您需要从Promise

返回runStoredProc
exports.runStoredProc = function (query,id) {
    return sql.connect(config.config).then(()=>{
        return sql.query`${query} ${id}`
      }).then(res=> {
        do something with the response    
      }).catch(error => {
        console.log(error)
    })
}

并且无需在循环

中包装db.runStoredProc
let toRun = result.recordset.length
let gen = async num => {
  for(let i=0;i<num;i++) {
    var resp = result.recordset[i].id
    console.log(i, resp)
    var sp = report
    var reportId = await db.runStoredProc(sp,resp)
  }        
}
gen(toRun).then(() => console.log("done!"))