Javascript 调用带有默认参数的异步函数作为参数检查的函数是否已处理同步?
我正在使用异步函数和默认参数,并在调用时进行求值 对于默认参数,我使用函数检查是否提供了值Javascript 调用带有默认参数的异步函数作为参数检查的函数是否已处理同步?,javascript,asynchronous,babeljs,ecmascript-2017,Javascript,Asynchronous,Babeljs,Ecmascript 2017,我正在使用异步函数和默认参数,并在调用时进行求值 对于默认参数,我使用函数检查是否提供了值 function mandatory(paramName) { throw new Error(`Missing parameter: ${paramName}`) } async function foo({ a, b = mandatory('b') }) { return Promise.resolve(b) } // uses chai.assert and chai-as-p
function mandatory(paramName) {
throw new Error(`Missing parameter: ${paramName}`)
}
async function foo({ a, b = mandatory('b') }) {
return Promise.resolve(b)
}
// uses chai.assert and chai-as-promised
describe('foo', () => {
it('should return a rejected promise', async () => {
const promise = foo({ a: 'hi' })
assert.isRejected(promise, /Error: Missing parameter: b/)
})
})
此测试失败,出现错误:
错误:缺少参数:b
因为此异常是在异步流外部引发的,您可以在此处看到:
var foo = function () {
var _ref = _asyncToGenerator(regeneratorRuntime.mark(function _callee(_ref2) {
var _ref2$a = _ref2.a,
a = _ref2$a === undefined ? 'a' : _ref2$a,
_ref2$b = _ref2.b,
b = _ref2$b === undefined ? mandatory('b') : _ref2$b;
return regeneratorRuntime.wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
return _context.abrupt('return', Promise.resolve(b));
case 1:
case 'end':
return _context.stop();
}
}
}, _callee, this);
}));
return function foo(_x) {
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");
});
};
}
我的问题是:这是按照规范还是按照实现?我希望承诺会被拒绝,而不是被抛出。这可能是Babel中的一个bug,因为在最新的Chrome(支持带标志的异步函数)和Firefox 52中,该代码按预期工作(即承诺被拒绝):
函数必需(paramName){
抛出新错误(`缺少参数:${paramName}`)
}
异步函数foo({a,b=mandatory('b')}){
返回承诺。解决(b)
}
foo({a:'hi'}).catch(error=>console.log('rejected'))//logs'rejected'
我想知道word如何与异步函数foo(a,b=mandatory('b'))
反应,参数是参数而不是对象属性。参数求值发生在函数调用时。对async
函数的调用本身是同步的。async函数是ES 2017草案的一部分,而不是ES 7。@bhantol它的工作原理与我测试过的相同。我不确定,因为我不知道规范是怎么说的。@Gothdo如果规范说了其他的东西,它应该被修复。要求对呼叫者进行双重责任错误检查似乎是不可接受的。