一尘不染

异步API是否应该同步抛出?

javascript

我正在编写一个JavaScript函数,该函数发出HTTP请求并返回对结果的承诺(但该问题同样适用于基于回调的实现)。

如果我立即知道为该函数提供的参数无效,该函数应该throw同步还是应该返回被拒绝的Promise(或者,如果您愿意,请使用Error实例调用回调)?

异步功能应 始终 以异步方式运行(特别是对于错误情况)有多重要?是否确定throw,如果你知道程序是不是一个合适的状态的异步操作继续进行?

例如:

function getUserById(userId, cb) {
  if (userId !== parseInt(userId)) {
    throw new Error('userId is not valid')
  }

  // make async call
}

// OR...

function getUserById(userId, cb) {
  if (userId !== parseInt(userId)) {
    return cb(new Error('userId is not valid'))
  }

  // make async call
}

阅读 289

收藏
2020-05-01

共1个答案

一尘不染

最终,决定是否同步投掷取决于您,您可能会发现有人在两边争辩。重要的是记录行为并保持行为的一致性。

我对此的 看法 是,您的第二个选项-将错误传递给回调-看起来更优雅。否则,您将得到如下代码:

try {
    getUserById(7, function (response) {
       if (response.isSuccess) {
           //Success case
       } else {
           //Failure case
       }
    });
} catch (error) {
    //Other failure case
}

这里的控制流程有些混乱。

似乎if / else if / else在回调中具有单个结构并放弃周围环境会更好try / catch

2020-05-01