Должна ли функция быть перенесена в асинхронный режим - PullRequest
0 голосов
/ 28 апреля 2020

Я имею дело с некоторой кодовой базой, и между мной и коллегой обсуждалась, ставить ли async перед именем функции в этом случае. Я бы сказал да, потому что у нас есть Обещание внутри, но здесь может быть не так. Любой совет?

return {
    **async ???** loadSmthForFilter: function (diseases) {
      return new Promise((resolve, reject) => {
        $.get('/api/bla', { diseases })
          .done(resolve)
          .fail(reject);
      });
    }

Ответы [ 3 ]

2 голосов
/ 28 апреля 2020

Можно, но вам не нужно , чтобы. Это зависит от того, хотите ли вы использовать оператор await (добавьте ключевое слово async) или использовать цепочку функций then (нет необходимости добавлять его).

Если вы решите, чтобы он был в неправильное место

return {
  loadSmthForFilter: async function (diseases) {
   return new Promise((resolve, reject) => {
    $.get('/api/bla', { diseases })
      .done(resolve)
      .fail(reject);
   });
}

Кстати, вы просто должны вернуть $.get напрямую, поскольку это обещание, нет необходимости заключать его в другое обещание. См .: Что такое явное обещание построения antipattern и как мне его избежать?

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

Ключевое слово async может быть очень полезным при необходимости, но оно добавляет дополнительные издержки к вызову функции, потому что оно внутренне оборачивает try / catch вокруг тела функции, обрабатывает возвращаемое значение по-разному и создает обещание.

Итак, я использую async только тогда, когда это необходимо, и именно тогда я хочу использовать await внутри функции или очень редко, когда я хочу воспользоваться преимуществами автоматической c обертки try / catch и Я использую асинхронные операции некоторого вида.

В вашем случае ни одна из этих ситуаций, кажется, не применима, поэтому я бы удалил анти-шаблон обещания (вручную упаковывая обещание в другое), вернув обещание что $.get() уже возвращается и делает это:

return {
    loadSmthForFilter: function (diseases) {
        return $.get('/api/bla', { diseases });
    }
};
0 голосов
/ 28 апреля 2020

Вам НЕ НУЖНО использовать asyn c с этой функцией. Функция возвращает обещание, но не ожидает его. Но я обычно ставлю asyn c для функции, которая возвращает обещание для ожидания вывода.

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