Всегда ли нужно вызывать функцию asyn c с помощью await? - PullRequest
2 голосов
/ 28 января 2020

Сначала немного контекста, у меня есть функция asyn c, которая регистрирует сообщения в базе данных MongoDB.

async function log_message(sender, conversationId, text) {
    try {
        const msg = new Message({
            sender: sender,
            conversationId: conversationId,
            text: text
        });
        await msg.save();
        console.log("Done");
    } catch (e) {
        console.log("An error happened while logging the message: " + e)
    }
}

Теперь у меня есть другая функция asyn c, которая запускается при получении сообщения и заботится о его обработке и получении некоторых данных. Как только эта функция сработает, я вызываю log_message, чтобы записать сообщение в моей базе данных, но я не хочу вызывать его с помощью await, в противном случае я бы подождал, пока функция log_message вернется, прежде чем обрабатывать сообщение, замедляя обработка сообщений.

    async getReply(username, message) {
        log_message("user", username, message);
        console.log("HI");
        let reply = await this.rs.reply(username, message, this);
        return reply;
    }

Тем не менее, Jetbrains Webstorm выдает мне это предупреждение «Отсутствует ожидание вызова функции asyn c». Теперь я провел несколько тестов, и если я вызываю функцию без ожидания, система ведет себя так, как я ожидал, сообщение обрабатывается, и моя функция регистрации записывает данные в базу данных асинхронно без прерывания. Если вместо этого я поставлю ключевое слово await перед вызовом функции регистрации, выполнение кода в основной функции будет приостановлено до тех пор, пока не будет записана БД.

Может кто-нибудь сказать мне, есть ли какие-нибудь fl aws каким образом я намеревался использовать ключевые слова async / await?

Ответы [ 4 ]

1 голос
/ 28 января 2020

Нет необходимости, если ваш лог c не требует результата вызова async. Хотя в вашем случае в этом нет необходимости, в документации перечислены два преимущества включения этого предупреждения:

Хотя это, как правило, не требуется, оно дает два основных преимущества. Во-первых, вы не забудете добавить 'await', когда окружаете свой код try-catch. Во-вторых, явное ожидание помогает среде выполнения V8 предоставлять асин c трассировки стека

0 голосов
/ 28 января 2020

Хотя я вижу, что у вас есть ответы здесь.

Позвольте мне рассказать вам об этом сейчас!

Asyn c функции не обязательно должны иметь вызов await внутри, но причина создания асинхронной функции c заключается в том, что вам необходим асинхронный вызов, для которого вы хотите дождаться результата, прежде чем двигаться вперед в потоке.

async getReply(username, message) {
        log_message("user", username, message);
        console.log("HI");
        let reply = await this.rs.reply(username, message, this);
        return reply;
    }

Вышеупомянутая функция будет работать, но почему именно ты бы сделал это асин c? Поскольку вы не используете никакой асинхронной функциональности. Он работает так же, если используется следующим образом: -

getReply(username, message) {
        log_message("user", username, message);
        console.log("HI");
        let reply = await this.rs.reply(username, message, this);
        return reply;
    }
0 голосов
/ 28 января 2020

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

0 голосов
/ 28 января 2020

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

Другими словами, если вы не если вы не хотите ждать, пока какой-нибудь другой процесс завершит работу sh, вам следует избегать использования в вашем методе ключевого слова asyn c.

Здесь имеет смысл ключевое слово await:

await msg.save();

Поскольку он ожидает, пока не будет сохранен, прежде чем журнал будет завершен. Но в методах, которые вы хотите, чтобы все выполнялись, не дожидаясь завершения других процессов. Только не используйте asyn ключевое слово. Если вы не хотите ждать здесь:

await this.rs.reply(username, message, this);

Не используйте asyn c здесь:

async getReply(username, message)

Если вам нужно что-то ждать в getReply тогда вам нужно добавить asyn c ключевое слово, в противном случае ключевое слово не обязательно.

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