Хобрук: Ваш путь к мастерству в программировании

Каков (потенциальный) недостаток повсеместного использования асинхронных функций?

Я изучаю Javascript. Это может показаться безумной идеей, но я не нахожу четких ответов в Google. Могу ли я просто заменить все свои обычные функции/методы везде на async function? Я имею в виду, что в этом, кажется, нет недостатков, и это делает вещи намного проще. Там, где ситуация включает только синхронные шаги, вы просто не используете await, и он будет работать как обычные функции. Легкий!

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

Я что-то упустил здесь?

15.07.2018

Ответы:


1

Функции async всегда возвращают Promises. Это означает, что каждый раз, когда вы не имеете дело с чем-то асинхронным, вам придется преобразовать возвращенное Promise в значение, прежде чем вы сможете его использовать. Например:

const return4 = async () => 4;
console.log(4 + return4());

Вместо этого вам придется использовать (излишне многословный):

const return4 = async () => 4;
(async () => {
  console.log(4 + await return4());
})();

(или вызовите .then в вызове return4 перед его использованием)

С другой стороны, если бы return4 не было async, то, конечно, только console.log(4 + return4()); работало бы нормально.

Еще одна проблема с функциями async заключается в том, что для их преобразования в код ES5 (что обеспечивает совместимость с устаревшими браузерами, такими как IE) требуется regenerator-runtime, который очень тяжеловесен. Например, транспиляция следующей строки с помощью Babel:

const foo = async () => console.log('async!');

Когда вы подключаете его к repl, вы получаете:

"use strict";

function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
  try {
    var info = gen[key](arg);
    var value = info.value;
  } catch (error) {
    reject(error);
    return;
  }
  if (info.done) {
    resolve(value);
  } else {
    Promise.resolve(value).then(_next, _throw);
  }
}

function _asyncToGenerator(fn) {
  return function() {
    var self = this,
      args = arguments;
    return new Promise(function(resolve, reject) {
      var gen = fn.apply(self, args);
      function _next(value) {
        asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
      }
      function _throw(err) {
        asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
      }
      _next(undefined);
    });
  };
}

var foo =
  /*#__PURE__*/
  (function() {
    var _ref = _asyncToGenerator(
      /*#__PURE__*/
      regeneratorRuntime.mark(function _callee() {
        return regeneratorRuntime.wrap(function _callee$(_context) {
          while (1) {
            switch ((_context.prev = _context.next)) {
              case 0:
                return _context.abrupt("return", console.log("async!"));

              case 1:
              case "end":
                return _context.stop();
            }
          }
        }, _callee);
      })
    );

    return function foo() {
      return _ref.apply(this, arguments);
    };
  })();

что также зависит от того, что regeneratorRuntime уже включено в скрипт, а это 700 с чем-то строк кода, которые вы можете увидеть здесь.

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

15.07.2018
Новые материалы

Основы принципов S.O.L.I.D, Javascript, Git и NoSQL
каковы принципы S.O.L.I.D? Принципы SOLID призваны помочь разработчикам создавать надежные, удобные в сопровождении приложения. мы видим пять ключевых принципов. Принципы SOLID были разработаны..

Как настроить Selenium в проекте Angular
Угловой | Селен Как настроить Selenium в проекте Angular Держите свое приложение Angular и тесты Selenium в одной рабочей области и запускайте их с помощью Mocha. В этой статье мы..

Аргументы прогрессивного улучшения почти всегда упускают суть
В наши дни в кругах веб-разработчиков много болтают о Progressive Enhancement — PE, но на самом деле почти все аргументы с обеих сторон упускают самую фундаментальную причину, по которой PE..

Введение в Джанго Фреймворк
Схема «работать умно, а не усердно» В этой и последующих статьях я познакомлю вас с тем, что такое фреймворк Django и как создать свое первое приложение с помощью простых и понятных шагов, а..

Настольный ПК как «одно кольцо, чтобы править всеми» домашних компьютеров
Вид после 9 месяцев использования С настольных компьютеров все началось, но в какой-то момент они стали «серверами», и мы все перешли на ноутбуки. В прошлом году я столкнулся с идеей настольных..

Расширенные методы безопасности для VueJS: реализация аутентификации без пароля
Руководство, которое поможет вам создавать безопасные приложения в долгосрочной перспективе Безопасность приложений часто упускается из виду в процессе разработки, потому что основная..

стройный-i18следующий
Представляем стройную оболочку для i18next. Эта библиотека, основанная на i18next, заключает экземпляр i18next в хранилище svelte и отслеживает события i18next, такие как languageChanged,..