Нужна помощь в выяснении, почему xxx.catch не улавливает ошибку - PullRequest
0 голосов
/ 04 июля 2019

Я на грани выброса компьютера через окно. Я просто не понимаю, почему это не работает:

async function play(message, msg) {
    addytb(message, msg[3]).catch(err => {console.log('err');});
}

async function addytb(message, url) {
    ytbapi.getVideo(url)
    .then(video => {
        message.channel.send(`J'ai ajouté ${video.title} à la queue !`);
        queue.get(message.guild.id).push({"url": url, "type": 'youtube', "title": video.title});
    })
    .catch(() => {
        message.channel.send(`J'ai pas réussi à ajouter ça à la queue !`);
        throw 'error';
    });
}

Я искал в интернете 2 часа и не могу понять, почему у меня остаются необработанные обещания потепления. Я думаю, это потому, что ytbapi.getVideo () является асинхронным, но я не знаю, что делать.

Спасибо.

1 Ответ

0 голосов
/ 04 июля 2019

Во-первых, нет необходимости использовать ключевое слово «async» с функциями до тех пор, пока вы не ожидаете внутри него асинхронной функции. Я сделал некоторые изменения в коде, вы можете попробовать:

function play(message, msg) {
    addytb(message, msg[3])
        .then((data) => {
            //do something with data
        })
        .catch(err => {
            console.log('err is: ', err);
        });
}

function addytb(message, url) {
    return new Promise((resolve, reject) => {
        ytbapi.getVideo(url)
            .then(video => {
                message.channel.send(`J'ai ajouté ${video.title} à la queue !`);
                queue.get(message.guild.id).push({
                    "url": url,
                    "type": 'youtube',
                    "title": video.title
                });
                resolve("success");
            })
            .catch((err) => {
                message.channel.send(`J'ai pas réussi à ajouter ça à la queue !`);
                console.log(err)
                reject(err);
            });
    });
}

и если вы действительно хотите попробовать с async / await:

async function play(message, msg) {
    try {
        const data = await addytb(message, msg[3]);
        //do something with data
    } catch (err) {
        console.log('err is: ', err);
    }
}

function addytb(message, url) {
    return new Promise(async (resolve, reject) => {
        try {
            const video = await ytbapi.getVideo(url);
            message.channel.send(`J'ai ajouté ${video.title} à la queue !`);
            queue.get(message.guild.id).push({
                "url": url,
                "type": 'youtube',
                "title": video.title
            });
            resolve("success");
        } catch (err) {
            message.channel.send(`J'ai pas réussi à ajouter ça à la queue !`);
            console.log(err)
            reject(err);
        }
    });
}

ps: вам могут потребоваться некоторые модификации, так как у меня не было возможности попробовать код. надеюсь, это поможет:)

...