Я использую .catch, чтобы поймать отказ по обещанию, но там написано, что я использую .catch - PullRequest
0 голосов
/ 01 февраля 2019

У меня есть куча кода.Код имеет асинхронную функцию, то есть обещание.Я жду своего обещания изнутри попробуй ... поймай.Если есть ошибка, я отклоняю ее с реальным обещанием.Смотрите,

runService(options.target, options, socket)
    .then(async id => {
        if(user) {
            .
            .
            .
    })
    .catch(error => {
        console.log('Here', error);
        return socket.emit('error', error);
    });

RunService работает следующим образом:

const startService = (target, options, socket) => {
    return new Promise(async (resolve, reject) => {
        target = typeof(target) == 'string' && target.trim() != '' ? target.trim() : false;
        if(target) {
            try {
                let addresses = await dns.promises.lookup(url.parse(target).hostname, 4);
            } catch(exception) {
                return reject(exception);
            }
            const id = await createHash(32);
            const targetSlug = url.parse(target).hostname.split('www.').reverse()[0].replace(/[-.]/g, '');
            const date = new Date();
            socket.emit('log', { stage: 1, message: 'Starting simulation and analysis process' });
            const chrome = await launchChrome([
                `--window-size=${options.fullscan ? 1920 : options.desktopResolution.width},${options.fullscan ? 1080 : options.desktopResolution.height}`,
                '--disable-background-networking',
                '--disable-sync',
                '--disable-default-apps',
                '--no-first-run',
                '--enable-automation',
                '--disable-translate',
                '--disable-extensions',
                '--mute-audio',
                '--no-sandbox',
                headless ? '--headless' : ''
            ]);
    .
    .
    .
    });
};

Я использую функцию try ... catch, и я вызываю функцию, поскольку она в точности выдает исключения в

let addresses = await dns.promises.lookup(url.parse(target).hostname, 4);

Выдает и UnhandledPromiseRejectionWarning и вывод такой:

Вывод http://prntscr.com/mf60hr

Почему существует UnhandledPromiseRejectionWarning, а это не 'вызвать socket.emit('error', error) строку в .catch() блоке.Почему это?

Ответы [ 2 ]

0 голосов
/ 01 февраля 2019

Избегайте использования конструктора antipattern *1001*, и никогда не передайте async function в качестве исполнителя new Promise!Вы должны писать только

async function startService(target, options, socket) => {
    target = typeof(target) == 'string' && target.trim() != '' ? target.trim() : false;
    if(target) {
        // try {
            let addresses = await dns.promises.lookup(url.parse(target).hostname, 4);
        // } catch(exception) {
        //    throw exception;
        // }
        // well this `try`/`catch` is pointless, just drop it
        const id = await createHash(32);
        const targetSlug = url.parse(target).hostname.split('www.').reverse()[0].replace(/[-.]/g, '');
        const date = new Date();
        socket.emit('log', { stage: 1, message: 'Starting simulation and analysis process' });
        …
    }
}
0 голосов
/ 01 февраля 2019

В runService вы должны заключить код, начинающийся с:

let addresses...

вплоть до конца:

const chrome = await launchChrome([ вtry...catch block.


В настоящее время у вас есть следующие звонки await за пределами вашего try...catch:

const id = await createHash(32);

const chrome = await launchChrome([...

Если какая-либо из них содержит ошибки, ошибка не будет обнаружена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...