今天我在代码中发现了一个错误,导致回调可能被多次执行。 try ... catch的用途是用于JSON.parse()操作;但是,在回调本身内部发生错误。
var body='{}';
var callback=function (arg){
console.log('callback executed with arg='+arg);
arg? pack_michael(): pack_jolly();
}
try {
JSON.parse(body); //if JSON parse successful should callback once with true argument
callback(true);
} catch (e){
callback(false); //if JSON parse fails should callback once with false argument
}
上面的代码导致双回调打印:
callback executed with arg=true
callback executed with arg=false
我可以想到一些丑陋的解决方案,比如创建一个变量并检查是否发生了错误,或者嵌套了另一个不必要的尝试... catch,但是没有任何简洁的解决方案可以解决这个问题吗?
在try
/ catch
之后调用回调:
let parseOk = false;
try {
JSON.parse(body);
parseOk = true;
} catch (e){
// parseOk is already false
}
callback(parseOk);
如果你还想在回调本身中捕获错误,你可以用不同的try
/ catch
包围它,但这与JSON.parse
中发生的错误是分开的,因此它们不应该被组合。
在回调周围添加新的try/catch
try {
JSON.parse(body);
try {
callback(true);
} catch(err) { console.log("Error in callback")}
} catch (e){
callback(false); //if JSON parse fails should callback once with false argument
}