javascript - ¿Hay alguna manera de ajustar un bloque de espera/async try/catch a cada función?
express async-await (2)
Sí, también puede escribir fácilmente un envoltorio para funciones asincrónicas, solo use
async
/
await
:
function wrapper(f) {
return async function() {
// ^^^^^
try {
return await f.apply(this, arguments);
// ^^^^^
} catch(e) {
customErrorHandler(e)
}
}
}
O usa promesas directamente, como en este ejemplo que está más personalizado para expresar (especialmente con el número de parámetros):
function promiseWrapper(fn) {
return (req, res, next) => {
fn(req, res).catch(next);
};
}
Así que estoy usando express.js y estoy buscando usar async / await con el nodo 7. ¿Hay alguna manera de que aún pueda detectar errores pero deshacerme del bloque try / catch?
Tal vez un contenedor de funciones?
No estoy seguro de cómo esto realmente ejecutaría el código de la función y también llamaría
next(err)
.
exports.index = async function(req, res, next) {
try {
let user = await User.findOne().exec();
res.status(200).json(user);
} catch(err) {
next(err);
}
}
Algo como esto...?
function example() {
// Implements try/catch block and then handles error.
}
exports.index = async example(req, res, next) {
let user = await User.findOne().exec();
res.status(200).json(user);
}
EDITAR:
Algo más parecido a esto:
var wrapper = function(f) {
return function() {
try {
f.apply(this, arguments);
} catch(e) {
customErrorHandler(e)
}
}
}
Esto de alguna manera manejaría el bloque try / catch pero no funciona:
exports.index = wrapper(async example(req, res, next) {
let user = await User.findOne().exec();
res.status(200).json(user);
});
Consulte ¿Hay alguna forma de agregar try-catch a cada función en Javascript? para el ejemplo no asíncrono.
Una respuesta similar here esperanza puede ayudarte
const sthError = () => Promise.reject(''sth error'');
const test = opts => {
return (async () => {
// do sth
await sthError();
return ''ok'';
})().catch(err => {
console.error(err); // error will be catched there
});
};
test().then(ret => {
console.log(ret);
});