Итак, я создаю дискотечного бота.Для простоты, вот небольшая часть очень , которая иллюстрирует мою проблему:
const Discord = require('discord.js');
const client = new Discord.Client();
client.on('ready', async () => {
throw new Error('Omg');
});
async function start() {
try {
await client.login(process.env.DISCORD_BOT_TOKEN);
} catch (err) {
console.error('Caught the promise rejections');
}
}
start();
Когда я запускаю этот код, я ожидаю, что результат будет Caught the promise rejections
, и процесс должен впоследствиивыход.Однако, это не так.Вместо этого я получаю PromiseRejectionWarning
, и процесс не завершается (для этого нужно нажать Ctrl-C).Сначала я подумал, что, возможно, ошибки в обратных вызовах не распространяются на код, который их вызывает, поэтому я сделал еще один чистый пример JS:
const client = {
on(event, callback) {
this.callback = callback;
},
async login(token) {
while (true) {
// I assume the login method calls the callback in D.js
// (where else could it be called?)
await this.callback();
await sleep(5000);
}
},
};
client.on('ready', async () => {
throw new Error('Omg');
});
async function start() {
try {
await client.login(process.env.DISCORD_BOT_TOKEN);
} catch (err) {
console.error('Caught the promise rejections');
}
}
start();
Однако в этом случае выходные данные точно соответствуют ожидаемым;Я вижу строку из улова, и процесс немедленно завершается.Без перехвата я получаю необработанные ошибки отклонения обещания и незавершенный процесс.
Итак, мой вопрос: почему я не могу отловить отклонения обещания в своих обратных вызовах событий (например, on('ready')
)?