JavaScript - вложенные функции в eval не работают с блоком try / catch - PullRequest
0 голосов
/ 25 июня 2019

У меня есть следующий код для запуска в eval():

const code = `
    async function func() {
        asd();
    }

    func();
`;

try {
    console.log("running code");
    return eval(code);
}
catch (err) {
    console.log("error");
    return err.message;
}

В этом случае asd - это undefined, и поэтому я ожидаю, что ссылочная ошибка будет возвращена в виде строки (return err.message;). Однако вместо срабатывания блока catch генерируется исключение, как будто отсутствует блок try / catch. Но если бы я запустил eval("asd()"), блок catch перехватил бы ошибку и вернул строку. Есть ли что-то другое, что мне нужно сделать для вложенных функций?

Примечание. Весь этот код находится в асинхронной функции из-за другого кода (до const code ...), если это имеет значение.

1 Ответ

1 голос
/ 25 июня 2019

Вы должны обрабатывать eval как обещание, так как вы используете обещание внутри него.

const asyncEval = () => {
  const code = `
    async function func() {
        asd();
    }

    func();
`;

    console.log("running code");
    return Promise.resolve(eval(code));
}

const ele = document.getElementById('result');

asyncEval()
  .then(res => {
    ele.innerText = res;
  })
  .catch(err => {
    ele.innerText = "ERROR: " + err;
  })

Чтобы убедиться, что оно работает, если обещание возвращено или нет, вы можете сделать Promise.resolve(eval(code)) вместо eval(code).

В любом случае, я бы также рекомендовал прочитать это и не использовать eval: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/eval#Do_not_ever_use_eval!

...