在 try catch 语句中将 err 传递给 finally

Passing an err to finally in a try catch statement

我正在尝试编写一个异步数组严格相等函数来报告我想要的错误。

这是我的函数:

ArrayStrictEqual = function (arr1, arr2, callback) {
    var arr2s = arr2.sort();
    var eq = true;
    try {
        arr1.sort().forEach(function (item, index, array) {
            if(!(_.isEqual(arr2s[index], item))) {
                throw new Error(arr1 + " is not strictly equal to " + arr2);
            }
        });
    }
    catch (err) {
        if (err) eq = false;
    }
    finally {
        callback(err, eq);
    }
};

但是,当我 运行 这个时,它说 Uncaught ReferenceError: err is not defined

我打算在 try-catch 之前将 err 初始化为 null。但这似乎不是正确的做法。但是,我不确定正确的做法是什么。我是否应该以完全不同的方式解决这个问题(即不是 try-catch)?

err 仅在 catch 语句的范围内(有关技术细节,请参阅 Why do catch clauses have their own lexical environment?)。

你可以简单地做

try {
    …
    callback(null, true);
} catch (err) {
    callback(err, false);
}

虽然这可能不是您想要的,因为它会在第一个 callback() 抛出时再次调用 callback。为了避免这种情况,我们需要像 Python 中那样的 try-catch-else,在 JS 中你需要一个额外的布尔标志。

然而,抛出一个错误来中断 forEach 迭代只是一种可怕的做法。不要这样做。使用 .every() 代替,它完全符合您的要求。另外,您可以考虑避免比较数组的变异,在排序之前复制它们。