情景: 使用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!"))
答案 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!"))