Пробую удачу и надеюсь, что этот вопрос не слишком глупый 🙃
Я пытаюсь создать функцию, которая помогла бы мне попробовать/поймать код, когда я не хочу выполнять обработку ошибок (т.е. когда мне все равно, если код не работает)
Это выглядит примерно так:
function failSafe(callback) {
try {
return callback()
} catch(err) {
console.warn(err)
}
}
На самом деле, у меня есть версия failSafeAsync, в которой обратный вызов awaited перед возвратом для эффективного перехвата.
Я пытаюсь найти решение для использования одной и той же функции для синхронизации и асинхронного кода. Я думаю, что это возможно при соответствующем манипулировании обещаниями, но я не понимаю, как это сделать.
Не могли бы вы указать мне правильное направление?
Как вы хотите восстановиться, если код не работает? Если вы хотите перезапустить всю свою программу, вам могут помочь события uncaughtException и unhandledRejection.
Это очень хороший вопрос, так как он фактически объясняет, почему мы должны избегать асинхронных функций. Так оно и есть. Вы можете сделать стандартную функцию, возвращающую обещание или нет. Затем проверьте returnValue instanceof Promise и соответственно решите, что делать дальше.
@Redu Спасибо, не могли бы вы добавить это как ответ с небольшим количеством кода? Если нет, я попытаюсь ответить на основе вашего комментария, потому что это уместное предложение.
Возможно, вы можете придумать следующую реализацию. Функция failsafe либо возвращает ожидаемый результат, либо перехватывает ошибку и возвращает undefined. Очевидно, что если обратный вызов является асинхронной функцией, вы получите обещание, разрешающее либо ожидаемое значение, либо неопределенное в случае обнаружения ошибки в обещании.
async function fa(p){
return await new Promise((v,x) => Math.random() < 0.5 ? x("async oops") : setTimeout(v,100,p));
}
function fs(p){
if (Math.random() < 0.5) {throw new Error("sync oops")};
return p;
}
function failsafe(cb,...args){
var result;
try{
result = cb(...args);
return result instanceof Promise ? result.catch(e => console.info(e))
: result;
}
catch(err){
console.info("error caught: ",err);
}
}
(async function topLevelAwait(){
var result = Math.random() < 0.5 ? failsafe(fa,10) : failsafe(fs,11);
result instanceof Promise && (console.info("promise"),result = await result);
console.info(result);
})();
Лучше запускать в dev tools..
«Я пытаюсь найти решение, позволяющее использовать одну и ту же функцию для синхронизации и асинхронного кода». не. Если только вы действительно не хотите проверить пределы своего здравомыслия. Смотрите ссылки в конце моего ответа здесь