首页 > 解决方案 > 延迟接听承诺的电话

问题描述

我的 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,如果成功,我无法退出。

标签: javascriptmysqlnode.jspromise

解决方案


试试这个内部捕获,

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);
        });
    })
}

推荐阅读