根据参数使函数动态异步

问题描述 投票:0回答:2

我试试运气,希望这个问题不要太蠢🙃

我正在尝试创建一个函数,当我不想进行错误处理时(即,当我不关心代码是否失败时),它可以帮助我尝试/捕获代码

看起来像:

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

其实我有一个

failSafeAsync
版本回调是
awaited
在返回之前被有效捕获

我正在尝试找到一种解决方案,以对 syncasync 代码使用相同的功能。我认为这可以通过适当地操纵承诺来实现,但我不知道怎么做。

你能给我指出正确的方向吗?

javascript node.js async-await promise es6-promise
2个回答
0
投票

您可以使用

async
/
await
创建一个统一的
failSafe
函数,适用于同步和异步代码。这是一个示例实现:

async function failSafe(callback) {
  try {
    if (callback instanceof Function) {
      const result = await Promise.resolve(callback());
      return result;
    } else {
      return callback;
    }
  } catch (err) {
    console.warn(err);
  }
}

在这个实现中,如果

callback
参数是一个函数,我们
await
Promise.resolve(callback())
返回的承诺,这允许我们统一处理同步和异步函数。如果
callback
不是函数,我们只需立即返回它。

下面是一个将此函数与同步和异步函数一起使用的示例:

function syncFunc() {
  throw new Error('Sync function failed');
}

async function asyncFunc() {
  throw new Error('Async function failed');
}

async function main() {
  console.log(await failSafe(() => 42)); // prints "42"
  console.log(await failSafe('hello')); // prints "hello"
  console.log(await failSafe(syncFunc)); // prints nothing, logs the error to the console
  console.log(await failSafe(asyncFunc)); // prints nothing, logs the error to the console
}

main();

-1
投票

我不太确定这是否是您想要实现的目标。如果是这样的话,可能会更具描述性,我们可以为实际问题寻找解决方案。

async function failSafe(callbackFn, isAsync) {
  if (!isAsync) {
    try {
      return callback();
    } catch(err) {
      console.warn(err);
    }
  } else {
      try {
      await return callback();
    } catch(err) {
      console.warn(err);
    }
  }
}

© www.soinside.com 2019 - 2024. All rights reserved.