如何避免使用promise catch来控制程序?

How to avoid using promise catch to control program?

一段代码:

// file defined here.
return getFile.then(function _gotFile(file) { // getFile is a promise, resolved OR rejected
  // A
  // do something on file
  return file;
})
  .catch(function() {
    // B
    // do other things on file, 
    return file;
  })

在上面的代码中,我使用 promise catch 来控制程序流程:如果 getFile promise 已解决,则执行 A,否则执行 B

这样写代码是好的做法吗?

如何重写上面这段代码来避免这种情况?谢谢

If getFile promise resolved, do A, otherwise, do B.

实际上,没有。当 A 失败时,它也会执行 B。如果你真的想要"otherwise",那么你need to use .then(…, …) instead of .then(…).catch(…). See also .

Is it good practice to write codes like this?

是,也不是。这取决于。

在有例外的情况下做出控制流决策是完全正常的。如果出现故障,处理错误绝对是一个好习惯。

另一方面,您可以过度使用异常。有时通过 fulfillment case 返回一个 boolean 值或结果类型枚举或类似的东西,并使用 if/else 来区分它,可以简单得多。

另外,当你在使用exceptions/rejections的时候,你需要小心并正确使用它们。 JS只有catch-all,没有条件异常,手动做很麻烦。尽管如此,只捕获您实际可以处理的特定类型的错误并重新抛出其他错误通常是一种很好的做法。看看 的例子。