Я не могу справиться с обещаниями отказов - PullRequest
0 голосов
/ 15 февраля 2019

У меня есть служба, которая анализирует веб-сайты, сжимает их источники, такие как CSS-документы, изображения и т. Д. У меня есть 2 функции, одна из них - метод Socket.IO socket.on() с функцией асинхронного обратного вызова.Другая основная функция для обслуживания.

socket.on('run', async options => {
    debug(`${options.target} Adresine Bir Kullanıcı İstek Yaptı!`);
    let user = null;
    console.log(options);
    if(options.token) {
        user = await User.findById(jwt.verify(options.token, config.get('jwtPrivateKey'))._id);
        options.userId = user._id.toString();
    } else if(options.visitor) {
        user = await Visitor.findById(options.visitor._id);
        if(user.report) {
            return socket.emit('error', new Error('You have exceeded your report limit'));
        } else {
            options.userId = user._id.toString();
        }
    }
    if(options.userId) {
        let userType = await UserType.find({ name: user.type });
        if(userType.length > 0 && ((user.type == 'Visitor' && user.report == undefined) || (user.reports.length < userType[0].rights.reportsLimit.limit || userType[0].rights.reportsLimit.unlimited))) {
            options.rights = userType[0].rights;
            let { error, data } = await wrapper(runService(options.target, options, socket));
            if(error) {
                console.log('Here', error);
                return socket.emit('error', error);
            }
        .
        .
        .
        }
    .
    .
    .
    }
});

В приведенной выше функции

let { error, data } = await wrapper(runService(options.target, options, socket));
if(error) {
    console.log('Here', error);
    return socket.emit('error', error);
}

Эта часть важна, потому что я вызываю свою основную функцию асинхронного обслуживания runService с моей асинхронной функцией.функция-обертка с именем wrapper.Это функция-обертка;

const wrapper = promise => (
    promise
        .then(data => ({ data, error: null }))
        .catch(error => ({ error, data: null }))
);

В моей основной асинхронной сервисной функции я только выдаю ошибку;

async function runService(target, options, socket) {
     throw new Error('any error');
}

Но ожидаемый результат сильно отличается от фактического результата.Вот вывод этого кода:

Here Error: any error
    at startService (C:\Projeler\OpDetect\Background-Service\lib\app.js:404:11)
    at Socket.socket.on (C:\Projeler\OpDetect\Background-Service\app.js:73:57)
    at process._tickCallback (internal/process/next_tick.js:68:7)
(node:16600) UnhandledPromiseRejectionWarning: Error: any error
    at startService (C:\Projeler\OpDetect\Background-Service\lib\app.js:404:11)
    at Socket.socket.on (C:\Projeler\OpDetect\Background-Service\app.js:73:57)
    at process._tickCallback (internal/process/next_tick.js:68:7)
(node:16600) UnhandledPromiseRejectionWarning: Unhandled promise rejection.
 This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 2)
(node:16600) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate

процесс Node.js с ненулевым кодом выхода.

Мои ожидания по поводу вывода выглядят так:

Here Error: any error
    at startService (C:\Projeler\OpDetect\Background-Service\lib\app.js:404:11)
    at Socket.socket.on (C:\Projeler\OpDetect\Background-Service\app.js:73:57)
    at process._tickCallback (internal/process/next_tick.js:68:7)

Поскольку я уже обработал отклонение обещания своей функцией-оберткой и перехватил отклонение, почему еще 2 UnhandledPromiseRejectionWarning ошибки при отклонении?

Кроме того, строка,

return socket.emit('error', error);

не звонит без причины.Это должно было быть вызвано, когда if утверждение правдиво.Почему не вызывается эта socket.emit функция?

1 Ответ

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

В качестве наилучшей практики используйте try {} catch(){} с асинхронным ожиданием.

Например.

userUtils.signUp = async (userName) => {
try {
    const callFunction = await userUtils.checkExistancy(userName);

    if (!callFunction.isExist) {
        ...
    } else {
        ...
    }
} catch (err) {
    console.log(err);
    throw err;
 }

};

в вашем случае это будет похоже на

socket.on('run', async options => {
try {
    user = await User.findById(jwt.verify(options.token, config.get('jwtPrivateKey'))._id);
    options.userId = user._id.toString();
    return true;
} catch (err) {
    throw err;
}});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...