NodeJS 根据参数使函数动态异步

kupeojn6  于 2023-03-17  发布在  Node.js
关注(0)|答案(1)|浏览(126)

我正在尝试创建一个函数,当我不关心代码是否失败时,它可以帮助我尝试/捕获代码:

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

实际上,我有一个failSafeAsync版本,其中回调在被返回之前是awaited,以便被有效地捕获。
我试图找到一个解决方案,使用相同的函数为同步异步代码。我认为这可能是可能的,与适当的操纵承诺,但我不知道如何。
你能给我指一下正确的方向吗?

bttbmeg0

bttbmeg01#

也许你会想出一个如下的实现。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.log(e))
                                     : result;
  }
  catch(err){
    console.log("error caught: ",err);
  }
}

(async function topLevelAwait(){
   var result = Math.random() < 0.5 ? failsafe(fa,10) : failsafe(fs,11);
   result instanceof Promise && (console.log("promise"),result = await result);
   console.log(result);
})();

最好在开发工具中运行。

相关问题