Задержка вызова в уловке обещаний

Я предлагаю вам использовать мини-сервер для запуска таких приложений на локальном хосте (если вы не используете какой-либо встроенный сервер).

Вот что очень просто настроить и запустить:

https://www.npmjs.com/package/tiny-server
1
задан Mayank Kumar 13 July 2018 в 15:28
поделиться

2 ответа

Попробуйте сделать это внутри catch,

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);
        });
    })
}
2
ответ дан Chathura Widanage 17 August 2018 в 13:32
поделиться
  • 1
    не уверен, что у вас есть .catch(reject) – Jaromanda X 13 July 2018 в 06:58
  • 2
    Да. это не обязательно право. Я отредактирую. – Chathura Widanage 13 July 2018 в 06:58
  • 3
    Или может быть все еще необходимо из-за let con=mysql.createConnection(configs[this.config]). WDYT? – Chathura Widanage 13 July 2018 в 07:03
  • 4
    соединение создается и заканчивается каждый раз, когда вызывается query, поэтому я не уверен, что он вообще – Jaromanda X 13 July 2018 в 08:37
  • 5
    Что произойдет, если в этой строке будет выбрано исключение. Это приведет к неправильной ошибке. – Chathura Widanage 13 July 2018 в 08:47

Не знаете, зачем вам нужен бесконечный рекурсивный вызов во время исключения. Вы должны изменить свой дизайн, чтобы ограничить повтор.

Во всяком случае для вышеуказанного сценария ниже код может помочь

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

    })
}

-1
ответ дан Ramanathan Ganesan 17 August 2018 в 13:32
поделиться
  • 1
    это не сработает, потому что тогда любой вызов query, который имеет хотя бы один сбой, приведет к результату undefined, а не к значению, разрешенному resolve(r) – Jaromanda X 13 July 2018 в 08:36
  • 2
    Нет, это сработает. вызовите запрос с по крайней мере одним результатом отказа в повторном запросе через 3 секунды. Пожалуйста, проверьте ниже исполняемый ответ – Ramanathan Ganesan 13 July 2018 в 16:55
  • 3
    Нет, он не работает, он не будет работать, он не может работать – Jaromanda X 14 July 2018 в 00:27
  • 4
    Я пробовал, и это не сработало. блок catch должен вернуть обещание, если я прав. – Mayank Kumar 14 July 2018 в 16:32
Другие вопросы по тегам:

Похожие вопросы: