在我的Db包装器中,有一个方法是nodejs mysql,如下所示:
let mysql=require('mysql')
query(sql,args,count=0){
let con=mysql.createConnection(configs[this.config])
return new Promise((resolve,reject)=>{
con.query(sql,args,(e,r)=>{
if(e){
if(e.code=='ER_CON_COUNT_ERROR'){
reject(e)
}
r=false
}
con.end(e=>{
return resolve(r)
})
})
}).catch(e=>{
//want to delay this call
if(count<5){
return this.query(sql, args,count+1)
}
return false
})
}
在失败的情况下,我递归调用query
,但它是瞬间发生的。我想根据决定重试次数的count
来延迟此呼叫。
这是我的使用方式:
let test=async()=>{
let promises=[]
for(let i=1;i<100;i++){
promises.push(db.query('SELECT * FROM verbs'))
}
let r=await Promise.all(promises)
console.log(r[r.length-1],r.length)
}
test();
有什么好的方法可以做到这一点?我尝试使用setTimeout
,但是却搞砸了promise
连锁店,成功的话我无法退出。
答案 0 :(得分:2)
尝试在内部捕获,
let mysql=require('mysql')
query(sql,args,count=0){
let con=mysql.createConnection(configs[this.config])
return new Promise((resolve,reject)=>{
con.query(sql,args,(e,r)=>{
if(e){
if(e.code=='ER_CON_COUNT_ERROR'){
reject(e)
}
r=false
}
con.end(e=>{
return resolve(r)
})
})
}).catch(e=>{
//want to delay this call
return new Promise((resolve,reject)=>{
setTimeout(()=>{
this.query(sql, args,count+1).then(resolve).catch(reject);
},2000);
});
})
}
答案 1 :(得分:-1)
不确定在异常期间为什么需要无限递归调用。您必须更改设计以限制重试。
在上述情况下,无论如何,以下代码可以提供帮助
let mysql=require('mysql')
query(sql,args,count=0){
return new Promise((resolve,reject)=>{
let query_data = () => {
let con=mysql.createConnection(configs[this.config])
con.query(sql,args,(e,r)=>{
if(e){
if(e.code=='ER_CON_COUNT_ERROR'){
reject(e)
}
r=false
}
con.end(e=>{
return resolve(r)
})
})
}
try {
query_data();
} catch(e) {
// statements
console.log(e);
setTimeout(query_data, 3000);
}
})
}