Последствия для явного объявления функции API узла как асинхронного? - PullRequest
0 голосов
/ 08 января 2020

Учитывая узел express приложения, мы можем объявить функцию в API как асинхронную, используя 'asyn c'.

app.get(/v1/user', async function(request, response) {
    response.status(200).send({ message: messageReturn });
});

Насколько я понимаю, это полезно, если вы используете await на функция внутри API. Однако если API не нужно ничего ждать, есть ли какие-либо последствия (синтаксические или производительные), если они есть, по сравнению с тем, чтобы не вызывать эту функцию как async? т.е. я могу просто объявить каждую функцию API как asyn c вместо

app.get(/v1/user', function(request, response) {
    response.status(200).send({ message: messageReturn });
});

1 Ответ

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

Функция async всегда возвращает обещание.

Но Express НЕ обращает никакого внимания на возвращаемое значение из обработчика или промежуточного программного обеспечения, которое вы передаете app.get(), или любого другого маршрута или промежуточного программного обеспечения. регистрация.

Таким образом, вы можете использовать async, когда вам НУЖНО использовать его, чтобы вы могли использовать await при реализации функции. Но Expresss не обращает никакого внимания на возвращенное обещание и не будет ничего с ним делать.

Насколько я понимаю, это полезно, если вы используете await для функции внутри API.

Да. И это единственная причина, чтобы объявить это async.

Однако, если API не нужно ничего ждать, есть ли какие-либо последствия (синтаксические или производительность), если таковые имеются, по сравнению с не вызывая эту функцию как asyn c?

Возможно, это не влияет на производительность, но вы заставляете интерпретатора делать некоторые дополнительные издержки. Он собирается поместить try/catch вокруг вашего кода и даст новое обещание, которое подключается как к try/catch, так и к возвращаемому значению. Так как это обещание не используется, оно просто тратит впустую циклы для интерпретатора, поскольку он должен создавать и собирать мусор для нового запроса для каждого запроса, а также будет иметь некоторые дополнительные служебные настройки, установленные внутри интерпретатора для перехвата исключений в async функция (поскольку инфраструктура функций async превращает исключения в отклоненное обещание).

Можно ли просто объявить каждую функцию API как asyn c

You "Можно". Но я бы сказал, что вы не должны. async имеет несколько определенных c целей. Если ваш код не нуждается ни в одной из этих целей, я бы сказал, что вы не должны его использовать.

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