Сделать функцию динамически асинхронной в зависимости от параметра

Пробую удачу и надеюсь, что этот вопрос не слишком глупый 🙃

Я пытаюсь создать функцию, которая помогла бы мне попробовать/поймать код, когда я не хочу выполнять обработку ошибок (т.е. когда мне все равно, если код не работает)

Это выглядит примерно так:

function failSafe(callback) {
  try {
    return callback()
  } catch(err) {
    console.warn(err)
  }
}

На самом деле, у меня есть версия failSafeAsync, в которой обратный вызов awaited перед возвратом для эффективного перехвата.

Я пытаюсь найти решение для использования одной и той же функции для синхронизации и асинхронного кода. Я думаю, что это возможно при соответствующем манипулировании обещаниями, но я не понимаю, как это сделать.

Не могли бы вы указать мне правильное направление?

«Я пытаюсь найти решение, позволяющее использовать одну и ту же функцию для синхронизации и асинхронного кода». не. Если только вы действительно не хотите проверить пределы своего здравомыслия. Смотрите ссылки в конце моего ответа здесь

VLAZ 21.02.2023 17:08

Как вы хотите восстановиться, если код не работает? Если вы хотите перезапустить всю свою программу, вам могут помочь события uncaughtException и unhandledRejection.

Heiko Theißen 21.02.2023 17:44

Это очень хороший вопрос, так как он фактически объясняет, почему мы должны избегать асинхронных функций. Так оно и есть. Вы можете сделать стандартную функцию, возвращающую обещание или нет. Затем проверьте returnValue instanceof Promise и соответственно решите, что делать дальше.

Redu 21.02.2023 20:57

@Redu Спасибо, не могли бы вы добавить это как ответ с небольшим количеством кода? Если нет, я попытаюсь ответить на основе вашего комментария, потому что это уместное предложение.

TOPKAT 22.02.2023 11:38
Руководство для начинающих по веб-разработке на React.js
Руководство для начинающих по веб-разработке на React.js
Веб-разработка - это захватывающая и постоянно меняющаяся область, которая постоянно развивается благодаря новым технологиям и тенденциям. Одним из...
Калькулятор CGPA 12 для семестра
Калькулятор CGPA 12 для семестра
Чтобы запустить этот код и рассчитать CGPA, необходимо сохранить код как HTML-файл, а затем открыть его в веб-браузере. Для этого выполните следующие...
Как собрать/развернуть часть вашего приложения Angular
Как собрать/развернуть часть вашего приложения Angular
Вам когда-нибудь требовалось собрать/развернуть только часть вашего приложения Angular или, возможно, скрыть некоторые маршруты в определенных средах?
Оптимизация React Context шаг за шагом в 4 примерах
Оптимизация React Context шаг за шагом в 4 примерах
При использовании компонентов React в сочетании с Context вы можете оптимизировать рендеринг, обернув ваш компонент React в React.memo сразу после...
Интервьюер: Почему '[] instanceof Object' возвращает "true"?
Интервьюер: Почему '[] instanceof Object' возвращает "true"?
Все мы знаем, что [] instanceof Array возвращает true, но почему [] instanceof Object тоже возвращает true?
Абстрактное синтаксическое дерево (AST) и как оно работает с ReactJS
Абстрактное синтаксическое дерево (AST) и как оно работает с ReactJS
Абстрактное синтаксическое дерево (AST) - это древовидная структура данных, которая представляет структуру и иерархию исходного кода на языке...
0
4
62
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Возможно, вы можете придумать следующую реализацию. Функция 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..

Другие вопросы по теме