Почему обещания JavaScript показывают <anonymous>расположение в журналах ошибок? - PullRequest
0 голосов
/ 06 января 2019

Я хочу войти в fileName, lineNo, ColNo в моей кодовой базе. Для этого я использую _thisLine (). Это в основном получает строку нет. создавая (не выбрасывая) ошибку. Но этот подход не работает, если я вызываю thisLine () из обещания

Можете ли вы помочь мне!

    function _thisLine() {
  const e = new Error();
  const regex = /\((.*):(\d+):(\d+)\)$/;
  const match = regex.exec(e.stack.split("\n")[2]); //i dont want to change thisLine function
  return match
    ? {
        filepath: match[1],
        line: match[2],
        column: match[3]
      }
    : "NOT FOUND";
}
function without() {
  return _thisLine(); // this is ok
}
function withPromise() {
  return new Promise(function(resolve, reject) {
    var result = _thisLine(); //inside promise unable to capture current line number
    resolve(result);
  });
}
console.log("without Promise", without());
withPromise().then(function(result) {
  console.log("with    Promise", result);
});

Я ожидаю, что withPromise вернет местоположение точки запуска но из-за обещания .. я не могу найти триггерную точку

enter image description here

ОТВЕТ (мой обходной путь)! Работает для меня!

  private _thisLine() {
    const e = new Error();
    // for path like - 'LogWrapper.debug (D:\\Projects\\rrr\\node\\build\\server\\log_server\\log_wrapper.js:101:14)'
    const regex1 = /\((.*):(\d+):(\d+)\)$/;
    // for path like - 'D:\\Projects\\rrr\\node\\build\\server\\http_repo\\labtest_repo.js:58:24'
    const regex2 = /(.*):(\d+):(\d+)$/;

    let match = null,
      callStackDepth = 2,
      errorExploded = e.stack.split("\n");

    while (!!!match) {
      //match both kind of path patterns
      match =
        regex1.exec(errorExploded[callStackDepth]) ||
        regex2.exec(errorExploded[callStackDepth]);

      //if not found then move to nearest path
      callStackDepth--;
    }

    return {
      filepath: match[1],
      line: match[2],
      column: match[3]
    };
  }

Ответы [ 2 ]

0 голосов
/ 06 января 2019

Я думаю, вам нужно исправить свое регулярное выражение. (Я не являюсь эпксертом в регулярных выражениях) Я предполагаю, что ваше регулярное выражение ожидает, что данные местоположения будут заключены в круглые скобки "()" и когда оно запускается внутри обещания, так как нет никаких возвращаемых значений, возвращаемых e.stack.split("\n")[2], выполнение регулярного выражения для этого возвращая ноль.

Я добавил консольный журнал для распечатки значений

function _thisLine() {
       const e = new Error();
       const regex = /\((.*):(\d+):(\d+)\)$/;
       const match = regex.exec(e.stack.split("\n")[2]);
       console.log('trigger location...'+e.stack.split("\n")[2]);
       console.log('match...'+match);
       return match
         ? {
             filepath: match[1],
             line: match[2],
             column: match[3]
           }
           : "NOT FOUND";
}
function without() {
  return _thisLine(); // this is ok
}
function withPromise() {
  return new Promise(function(resolve, reject) {
    var result = _thisLine(); //inside promise unable to capture current line number
	console.log('result is ...' + result);
    resolve(result);
  });
}
console.log("without Promise", without());
withPromise().then(function(result) {
  console.log("with    Promise", result);
});
0 голосов
/ 06 января 2019

Изъято - в ожидании отказа

Обработчики расчета Promise, выполняемые с чистым стеком, были неправильно интерпретированы как объяснение, почему объекту Error , созданному внутри такого обработчика, будут отсутствовать данные трассировки стека вызовов.

Данные не пропущены.

Регистрация ошибки в браузере. и детализация в консоли показывает наличие записей в массиве свойств new Error().stack .

...