Try / catch块打破异步JS代码

时间:2018-01-30 18:38:29

标签: javascript node.js async-await

我有以下数据库调用

const x = await doThis();
cons y = await doThat(x);

return somethingElse(x,y)

这样可以正常工作但是如果未正确返回promise,则无法进行调试。我想编写类似下面的代码

  try {
    const x = await doThis();
  } catch (e) {
    console.log(e);
  }
  try {
    cons y = await doThat(x);
  } catch (e) {
    console.log(e);
  }
  return somethingElse(x,y);

但是,我收到以下错误:

UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): ReferenceError: x is not defined

try / catch块是否会阻止代码异步运行?我该如何解决这个问题?

2 个答案:

答案 0 :(得分:6)

当您使用letconst声明变量时,它们是括号范围

在您的代码部分xy 括号范围到他们的try语句中 - 所以为什么它们不在{{1}之外定义}。您需要在try语句之前定义它们。

您也可以将try替换为const。这将在函数的开头提升变量声明(基于它是一个函数的var语句)并将起作用 - returnx将对整个函数可见,但我建议使用y声明的方法。

let

答案 1 :(得分:0)

与范围有关。您在try块中声明x和y,因此它们仅限于该块内。在块外声明它们并在try块内分配值。请记住,如果存在异常,则仍可能未定义值,在这种情况下,您应该在继续下一次调用之前检查值。

let x, y;

try {
  x = await doThis();
} catch (e) {
  console.log(e);
}

try {
  if(x) // check if x has a value, if there was an exception then x could be undefined
     y = await doThat(x);
} catch (e) {
  console.log(e);
}

if(y) // check if y has a value, if there was an exception then y could be undefined
    return somethingElse(x,y);
return null;// or something else??