在各处使用异步函数的(潜在)缺点是什么?

Jin*_*Niu 4 javascript async-await

我正在学习Javascript。这听起来像是个疯狂的主意,但我在Google上找不到明确的答案。我可以async function随处替换我所有的常规函数​​/方法吗?我的意思是,这似乎没有任何缺点,它使事情变得如此简单。在情况仅涉及同步步骤的情况下,您只是不使用await它,它将像正常功能一样工作。简单!

我个人觉得必须区分async功能和正常功能是不必要的负担。这就像驾驶手动变速箱汽车一样,在这种情况下,汽车本身可以轻松地自行处理传动装置。

我在这里想念什么吗?

Cer*_*nce 8

async函数总是返回Promises。这意味着,无论何时处理异步事务,都必须Promise先将返回值转换为值,然后才能使用它。例如:

const return4 = async () => 4;
console.log(4 + return4());
Run Code Online (Sandbox Code Playgroud)

取而代之的是,您将不得不使用(不必要的冗长):

const return4 = async () => 4;
(async () => {
  console.log(4 + await return4());
})();
Run Code Online (Sandbox Code Playgroud)

(或致电.thenreturn4使用它之前调用)

另一方面,如果return4不是这样的话async,当然console.log(4 + return4());仅靠它就可以了。

async函数的另一个问题是将它们转换为ES5代码(允许与IE等过时的浏览器兼容)require regenerator-runtime,这是非常重的。例如,使用Babel转译以下单行:

const foo = async () => console.log('async!');
Run Code Online (Sandbox Code Playgroud)

将其插入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);
    };
  })();

Run Code Online (Sandbox Code Playgroud)

这还取决于regeneratorRuntime脚本中是否已包含该脚本,您可以在此处看到700余行的代码。

在功能较弱的系统上,这可能会导致不小的影响。这就是为什么有些人(例如使用AirBNB样式指南的人)更喜欢从不使用async函数的方法,即使它们使脚本的异步控制流程更加清晰。