在 JS 中,为函数返回 true/false 作为成功/失败的指标是否被认为是一个好的标准?

Is returning true/false for a function as indicator for success/failure considered a good standard in JS?

提问人:Gilad 提问时间:6/29/2020 更新时间:6/29/2020 访问量:981

问:

我试图了解有关 JS 标准的一些内容:

在编写异步函数或任何返回任何类型 promise 的函数时,我需要假设此函数的用户希望捕获拒绝,而不是期望在解析中使用布尔值:

好:

doSomething = async () => {
  ...
  if (failed)
     reject(error)
  
  resolve("yay")
}

try {
  await doSomething()
  console.log("yay worked")
}
catch (error){
}

坏:

  doSomething = async () => {
  ...
  if (failed)
     resolve(false)
  
  resolve(true)
}

didWork = await doSomething()
if (didWork){
  console.log("yay")
else { 
}

但我的问题是关于非异步函数的,返回 true/false 作为成功/失败的指示器是否被认为是一个坏习惯?还有其他表示成功/失败的好方法吗? 另外,告诉我我上面关于承诺的好习惯的假设在你眼中是否正确。

谢谢!

JavaScript 节点.js 标准 Web 标准

评论

0赞 Gilad 6/29/2020
关于异步方式,我在 stackoverflow.com/questions/48811364/ 中看到了这一点......
0赞 Ramesh Reddy 6/29/2020
我认为返回布尔值没有任何问题。您的非异步函数有什么作用?
1赞 VLAZ 6/29/2020
我不认为这是一个好主意。如果你调用,你可能希望返回实际数据,你期望一个数字,而不是一个布尔值。处理问题的常用方法是处理它们并返回一些规范化值(例如,或者可能是 中的适当值)。另一种方法是抛出异常。我看不出半途而废的价值。findLowestNumber(array)-InfinitynullfindLowestNumber

答:

1赞 deceze 6/29/2020 #1

异步和非异步函数实际上是一样的:

  • true/false可以是对所提出问题的合法回答
  • 异常/承诺拒绝是严重失败的标志

例如,如果函数的目的是确定字符串是否为数字,则返回值 和 具有明显的含义。但是,如果您要传入一个对象,该对象一开始就不是字符串,则例外是合适的,因为对象的“此字符串是数字吗”问题的答案是 “mu” 🤷 ♂️ 。truefalse

对于异步函数也是如此:如果它需要网络请求来获得某个问题的 / 答案,那么用 / 解析 promise 是完全错误的;例如,如果您正在与服务器检查输入的用户名是否仍然可用,“是”和“否”是有效的答案。但是,如果网络请求本身失败了,那将是一个异常的失败,一个“mu”,你需要通过拒绝整个承诺来发出信号。truefalsetruefalse

promise 拒绝只是一个异步异常;使用语法,它甚至可以像同步异常一样处理。例外用于特殊事件,当由于超出正常快乐路径的情况而无法提供正常答案时。await