异步功能:我可以在执行await之前返回吗?

时间:2017-11-05 15:32:56

标签: javascript asynchronous babel

我有一个函数,我想在运行任何异步代码之前测试一个条件。如果不满足条件,我想返回错误。我正试图运行这样的东西:

async function myFunc(req, res, next) {
  if (condition) {
    return res.status(400).json({message: "condition not met"})
  }
  await something();
  res.json({});
}

但我的await功能仍然被调用。巴贝尔将其转化为:

"use strict";

var myFunc = function () {
  var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee(req, res, next) {
    return regeneratorRuntime.wrap(function _callee$(_context) {
      while (1) {
        switch (_context.prev = _context.next) {
          case 0:
            if (!condition) {
              _context.next = 2;
              break;
            }

            return _context.abrupt("return", res.status(400).json({ message: "condition not met" }));

          case 2:
            _context.next = 4;
            return something();

          case 4:
            res.json({});

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

  return function myFunc(_x, _x2, _x3) {
    return _ref.apply(this, arguments);
  };
}();

function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }

如您所见,在if条件之后,代码中断并继续循环到下一阶段。我不知道这是否是一个巴别塔问题,或者这是否应该如何运作。有没有办法实现这个?

2 个答案:

答案 0 :(得分:2)

  

但我的await功能仍然被调用。

不,不是,_context.next在您condition真实的情况下永远不会是2。 case 0明确表示如果something转到州2(呼叫!condition),否则转到return _context.abrupt。您的代码表示如果condition提前返回。这是相同的事情,只是相反。

如果条件为真,则在await something()被执行之前,您的代码确实会返回,并且在这种情况下永远不会执行await something()。 (请注意,myFunc无论如何都会返回一个承诺,只是它返回的承诺已经使用res.status(400).json({message: "condition not met"})的返回值解析(大概是undefined)。

  

如果不满足条件,我想返回错误。

这不是你的代码所说的。您的代码说“如果条件 满足,则返回错误:”

if (condition) {
  return res.status(400).json({message: "condition not met"})
}

答案 1 :(得分:0)

您可以反转condition并使用else声明

async function myFunc(req, res, next) {
  if (!condition) {
    return res.status(400).json({message: "condition not met"})
  } else {
    await something();
    return res.json({});
  }
}