Ошибка захвата генератора JavaScript ES6 перед следующим методом - PullRequest
1 голос
/ 27 октября 2019

Я начинаю изучать Итератор / Генераторы , и иногда я вижу некоторые странные детали. В настоящее время я не понимаю, почему мой код работает так.

В приведенном ниже примере кода мой основной код.

function* makeGenerator() {
    try {
        yield 1;
        yield 1;
        yield 1;
    } catch (e) {
        console.log(e);
    }
}

const generator = makeGenerator();

Когда я использую следующий метод перед броском, этот код работает нормально.

console.log(generator.next()); // { done: false, value: 1 }
console.log(generator.throw("WTF?")); // "WTF"
console.log(generator.next()); // { done: true, value: undefined }

function* makeGenerator() {
  try {
    yield 1;
    yield 1;
    yield 1;
  } catch (e) {
    console.log(e);
  }
}

const generator = makeGenerator();

console.log(generator.next()); // { done: false, value: 1 }
console.log(generator.throw("WTF?")); // "WTF"
console.log(generator.next()); // { done: true, value: undefined }

Но когда я хочу использовать метод throw перед следующим методом, я не понимаю, почему следующие методы не работают?

console.log(generator.throw("WTF?")); // "WTF"
console.log(generator.next());
console.log(generator.next());

function* makeGenerator() {
  try {
    yield 1;
    yield 1;
    yield 1;
  } catch (e) {
    console.log(e);
  }
}

const generator = makeGenerator();

console.log(generator.throw("WTF?")); // "WTF"
console.log(generator.next());
console.log(generator.next());

Ответы [ 2 ]

2 голосов
/ 27 октября 2019

Когда выполняется этот оператор:

const generator = makeGenerator();

... ни один из кодов в теле функции makeGenerator еще не выполнен, поэтому его блок try/catch еще не действует. Только при выполнении generator.next() код в теле функции makeGenerator начнет выполняться до следующего yield. В этот момент действует блок try/catch.

Итак ... если вы звоните generator.throw() до первого generator.next() вызова, вы запускаете исключение, которое необрабатывается кодом makeGenerator. Ваш код ломается с необработанным исключением. Как следствие, ничего из этого не следует, что generator.throw() (в вашей второй версии кода) выполняется.

1 голос
/ 27 октября 2019

Правильный способ генерирования ошибок через генераторы - это обернуть их в try...catch, потому что, не перехватывая ошибку, вы создаете там ошибку, тогда она падает до внешнего вызывающего кода (если есть) и,если не пойман, убивает скрипт.

function* makeGenerator() {
    try {
        yield 1;
        yield 1;
        yield 1;
    } catch (e) {
        console.log(e);
    }
}

const generator = makeGenerator();
console.log(generator.next()); 
try {
  generator.throw(new Error("WHOOPS"));
} catch(e) {
  console.log(e); // shows the error
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...