对于传入的JSON数据包可能没有其他JSON的节中的数据的实例,我有很多try...catch
语句。为此,我通常执行以下操作:
var numberofitems;
try {
numberofitems = payload.data.form_values["b691"].length;
} catch (err) { numberofitems = 0; }
但是,在很多情况下,我可能会得到一个空值,这会使以后的代码困惑。为了清理我的代码,我编写了一个函数来一行处理错误:
function checkTry(toCheck, errVal) {
try {
var result = toCheck;
} catch (err) {
result = errVal;
}
return result;
}
function datacheck() {
var data;
var result = checkTry(data.length, "0");
console.log(result);
}
datacheck();
然后我的示例如下:
var numberofitems = checkTry(payload.data.form_values["b691"].length,"0");
问题在于,当我尝试将
payload.data.form_values["b691"]
传递给函数时,它会引发错误,从而导致我最初试图捕获的错误。有没有办法解决?我做了一个JS Bin snippet来解决这个问题。
最佳答案
解决方案
使用默认值并完全抛弃try...catch
语句。异常实际上应该是一个异常,这是您不知道如何处理的(至少try...catch
在简单的对象解构中没有位置):
var numberofitems = (payload.data.form_values.b691 || []).length;
var numberofitems = ((payload.data.form_values || {}).b691 || []).length;
var numberofitems = (((payload.data || {}).form_values || {}).b691 || []).length;
var numberofitems = ((((payload || {}).data || {}).form_values || {}).b691 || []).length;
深入了解
该技术基于逻辑运算符的行为。对于逻辑AND,如果左侧为truthy,则返回该值,并且不评估右侧;如果左侧为falsy,则返回右侧。逻辑OR运算符的取反则成立。
由于
undefined
和null
都是虚假的,并且对象始终是真实的,因此我们可以放心地假设,如果给出了一个对象,则逻辑OR将返回该对象,并且仅在未提供任何对象的情况下才返回评估默认值。请注意,该技术仅限于始终为真/假的值。例如,就
value
的含义而言,以下内容是不确定的:const indeterministicTest = () => {
const rand = Math.floor(Math.random() * 3);
const value = rand === 1 ?
null : rand ? true : false;
console.log( value || `The value is ${value}, and I am a fallback string!` );
}
let timeoutId = null;
function runIndefinitely (callback) {
timeoutId = setTimeout( () => {
callback();
runIndefinitely(callback);
}, 1e3);
}
const start = document.querySelector("#start");
start.addEventListener("click", () => {
runIndefinitely(indeterministicTest);
});
const end = document.querySelector("#end");
end.addEventListener("click", () => {
timeoutId && clearTimeout(timeoutId);
});
<button id="start" type="button">Start</button>
<button id="end" type="button">End</button>