【问题标题】:How to define a const outside of the current scope/block?如何在当前范围/块之外定义一个常量?
【发布时间】:2016-06-17 03:14:07
【问题描述】:

我写的代码有点像这样:

try {
    const row = functionToGetStuffFromDatabase('SQL QUERY here');
} catch (err) {
    functionToDealWithError('Error: ' + err);
}
functionToProcessDatabaseResult(row);

但是,我无法访问 row 并将其作为参数传递给 processDatabaseResult,因为它是在 try 块的范围内定义的。而且,我无法在 try 块之外定义它并将其设置在块内部,因为我无法更改 const。我知道我可以只使用普通变量,但我想知道 consts 是否有任何方法可以做到这一点?

【问题讨论】:

  • 您没有在try 范围内调用processDatabaseResult 的任何原因?
  • 我希望能够以不同于处理数据导致的错误的方式处理数据库查询错误。
  • 我最好的猜测是尝试const window.myVar = value 之类的方法,但这实际上会引发错误。我发现的next-best thing 正在制作一个自定义对象并在其上定义一个getter,而没有相应的setter,但这似乎有点矫枉过正。

标签: javascript scope try-catch constants


【解决方案1】:

常量是块范围的,很像使用 let 语句定义的变量。详情请查看link

【讨论】:

  • 我知道这一点,我相信我已经说清楚了。这没有回答我的问题。
【解决方案2】:

由于块作用域,您将无法完全按照您编写的方式执行此操作。

您可以尝试重新排列您的代码。

function functionToGetStuffFromDatabase(query){
    try {
       doDatabaseQuery(query)
    } catch (err) {
       functionToDealWithError('Error: ' + err);
    }
}

const row = functionToGetStuffFromDatabase('SQL QUERY here');
functionToProcessDatabaseResult(row);

【讨论】:

  • 这里的问题是doDatabaseQuery 的结果没有从functionToGetStuffFromDatabase 返回。并且插入 return 语句将在函数到达 catch 块之前结束函数
  • 您对数据库的查询实际上是一个需要您传递回调的异步函数吗?
  • 我正在使用一些花哨的节点库(pg-promise 和 asyncawait),它们使数据库查询充当同步函数。因此,出于所有实际目的,它是同步的。
  • 如果是我,我会使用 promise.catch 处理程序处理来自数据库调用的可能异常。但是,我个人的偏好是避免异步等待抽象,只坚持承诺。
  • 嗯,在我看来,即使是相当基本的用例,promise 也不够强大和灵活,例如,没有很好的方法来打破链,将结果传递给链多个步骤,以及单元测试断言抛出的错误通常不会被抛出,并且可能会在看不见的地方溜走。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-14
  • 1970-01-01
  • 2021-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多