延迟电话以兑现承诺

时间:2018-07-13 06:37:50

标签: javascript mysql node.js promise

在我的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连锁店,成功的话我无法退出。

2 个答案:

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

    })
}