Как предотвратить двойные обратные вызовы во время try ... catch в javascript / nodejs? - PullRequest
0 голосов
/ 30 марта 2019

Сегодня я обнаружил ошибку в своем коде, которая приводит к возможному повторному вызову, выполняемому более одного раза. Предполагаемое использование 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

Я могу подумать о некоторых уродливых решениях, таких как создание переменной и проверка, произошла ли ошибка, или вложение еще одной ненужной попытки ... поймать, но нет ли какого-нибудь изящного решения, чтобы справиться с этим?

Ответы [ 2 ]

4 голосов
/ 30 марта 2019

Обратный вызов после try / catch:

let parseOk = false;
try {
    JSON.parse(body);
    parseOk = true;
} catch (e){
    // parseOk is already false
}
callback(parseOk);

Если вы также хотите перехватить ошибки в самом обратном вызове, вы можете окружить его другимtry / catch, но это отделяет от ошибок, которые происходят в JSON.parse, поэтому их не следует объединять.

0 голосов
/ 30 марта 2019

Добавить новый 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
}
...