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

标签 javascript asynchronous promise api-design

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

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

异步函数应该始终以异步方式运行有多重要,尤其是在错误情况下?如果您知道程序未处于适合异步操作继续的状态,是否可以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
}

最佳答案

最终决定是否同步抛出取决于你,你可能会发现有人争论任何一方。重要的是记录行为并保持行为的一致性。

我对此事的意见是您的第二个选择——将错误传递给回调——似乎更优雅。否则你最终会得到如下代码:

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

这里的控制流有点困惑。

似乎最好在回调中使用单个 if/else if/else 结构并放弃周围的 try/catch

关于javascript - 异步 API 是否应该同步抛出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21887856/

相关文章:

javascript - 如何替换数组中的某个符号?

swift - 如何将参数传递给 Swift 中异步执行的 block ?

javascript - 如何设置在 node.js 中运行异步函数的时间限制?

javascript - 异步等待回调行为

javascript - 关于 $q 和 Promise 的困惑

javascript - 如何从 ASP.NET .asmx 返回 JSON?

javascript - IIS反向代理到不同的服务器

php - Javascript、PHP、保存字段值

asynchronous - Flutter Future<dynamic> 与 Future<String> 子类型错误?

javascript - 有了 Promise,为什么浏览器会返回两次拒绝而不是两次解析?