我有以下数据库调用
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块是否会阻止代码异步运行?我该如何解决这个问题?
答案 0 :(得分:6)
当您使用let
或const
声明变量时,它们是括号范围。
在您的代码部分x
和y
括号范围到他们的try
语句中 - 所以为什么它们不在{{1}之外定义}。您需要在try
语句之前定义它们。
您也可以将try
替换为const
。这将在函数的开头提升变量声明(基于它是一个函数的var
语句)并将起作用 - return
和x
将对整个函数可见,但我建议使用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??