我有一个函数,我想在运行任何异步代码之前测试一个条件。如果不满足条件,我想返回错误。我正试图运行这样的东西:
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条件之后,代码中断并继续循环到下一阶段。我不知道这是否是一个巴别塔问题,或者这是否应该如何运作。有没有办法实现这个?
答案 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({});
}
}