javascript - 延迟接听承诺的电话
问题描述
我的 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
,如果成功,我无法退出。
解决方案
试试这个内部捕获,
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);
});
})
}
推荐阅读
- android - Android:将Json字符串转换为List,反之亦然
- c# - 如何编写单个方法而不是具有单个布尔表达式差异的两个方法
- c++ - 使用 lambda 表达式的 Raspbian G++ 8.3.0 会导致 ']' 之前的预期主表达式 - 即使标准设置为 c++14
- android - 训练 kNearest 时,大小为 20x20 的 Mat 被重新调整为 1x1200
- python-3.x - 如何在 TensorFlow 2.0 中做到这一点?
- python - pytest-cov 不使用新的覆盖版本 5.X 生成报告,适用于覆盖版本 4.4.2
- r - kableExtra column_spec 中的宽度不准确
- amazon-web-services - 使用 Powershell 报告 AWS 安全组
- mysql - 你的意见:MySQL-API 一对多关系,VueJS 和 JSON
- serial-port - UART传输工作但不通过端口引脚接收数据?