Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript JS中在try范围外具有相同名称的变量_Javascript - Fatal编程技术网

Javascript JS中在try范围外具有相同名称的变量

Javascript JS中在try范围外具有相同名称的变量,javascript,Javascript,我有以下代码: let tasks; try { await checkMongoConnection(); const tasks = await Task .find() await disconnectMongo(); if (!tasks) { return reject(); } // Is is possible to use the same naming? tasks = tasks; } catch(erro

我有以下代码:

let tasks;

try {
    await checkMongoConnection();
    const tasks = await Task
        .find()

    await disconnectMongo();

    if (!tasks) { return reject(); }
    // Is is possible to use the same naming?
    tasks = tasks;
} catch(error) {
    console.log(error.message);
}

在JS中,是否可以像这样使用相同的命名?e、 g.
tasks=tasks
并在
try
块外设置变量,或者我是否必须使用新名称,例如
tasks=fetchedTasks

否,如果内部范围内有
tasks
变量,则无法从内部范围访问外部范围内的
tasks
变量。可以为外部作用域变量赋值,但不能在外部作用域变量被同名的内部作用域变量遮挡时赋值


在本例中,您不需要外部的
tasks
,因此我只需删除它(以及
tasks=tasks
语句)。或者,如果您出于某种原因需要它,请删除内部的
任务
声明(只需从前面删除
常量
),这样
try
块中的代码将分配给外部的
任务

否,请使用不同的名称。为什么要首先定义一个新变量?什么是
return reject()?作为旁注,请尽量避免。如果上述代码中的
拒绝()
来自承诺执行者(
新承诺((解析,拒绝)=>…
),则您可能希望。在
异步
函数中或在处理给予您承诺的内容时,您几乎不需要或不想使用
新承诺(比如
Task.find()
显然是这样)。这是一种反模式设置,外部变量是这样的?我这样做的原因是我有多个try块,如果我将try块放在try块中,那将是意大利面地狱…@Kex-这就像同步函数一样:理想情况下,除了最外层,你根本没有一个
try
/
catch
(或至少是一个外部)层,处理其中嵌套调用的所有错误。这样,除了协调函数外,函数只执行它们所做的操作(或失败,错误传播)。在
async
函数中,承诺拒绝是例外(例外是承诺拒绝).async
函数与显式返回承诺的同步函数相比的最大优点之一是拒绝会向调用树上传播。:-)如果确实需要从
catch
块中写入数据库,这很好,但请确保
catch
块中的代码不会抛出(拒绝)并隐藏原始错误(同样,这与同步函数类似)。@Kex-在我看来不是,FWIW,前提是它引发的任何错误不会影响您报告的错误。:-)由于报告错误的错误通常不是您想要传播的错误,因此您可能需要
handleError
确保它从不拒绝承诺/抛出错误。如果它返回承诺并且希望调用它的
async
函数等待它完成,则使用
wait
他将错误报告与下一个同步运行。非常感谢您的讨论。非常感谢。