Я долго думал над предыдущем ответом и понял почему вы его не пометили - при том, что он таки является ответом (и это очевидно: в нем кристалльно прозрачно (если конечно как следует подумать) сказано, что вы пытаетесь использовать неинициализованные переменные в операции деления внутри опреатора console.log, который у вас следует после yield).
А подумав, я все же решил удовлетворить свою страсть к графомансву и разъяснить вам, почему смысл предыдущего ответа ответ столь очевиден - если хорошо и долго думать, естественно. Но если вам это и так явно, или вы уже все поправили, или для вас в этом разъяснении сликом много букв, то не читайте далше, а просто отметьте предыущий.
Но раз уж вы до сюда читать дошли, продолжу. Как уже сказано в предыдущем ответе, имена этих неопределенных переменных - _page и _pages. И да, для JS это(внезапно) - уже другие переменные, нежели page и pages, которым вы что-то там присваиваете: в JS встроен слишком слабый AI, чтобы понять, что это - одно и то же, а символы подчеркивания надо игнорировать.
Это переменным page и pages (без подчеркивания), а не _page и _pages вы таки присваиваете значения, хоть и немного поздновато: данные рассчитанные из этих значений, если бы у JS хватило ума догадаться, как должно быть, были бы выведены на консоль при следующем проходе цикла - что обязательно сбило бы вас с толку, если бы вы когда-нибудь обратили бы внимание на вывод в консоли - потому что данные относились бы не к тому циклу. Но так или иначе, если бы AI JS был получше (или вы бы использовали правильные имена переменных), то код бы в целом работал столько раз, сколько надо(хоть и вывел бы на консоль нечто страннное, впрочем, это уже фигня, да?).
А так, из-за слабости AI JS, один-то раз у вас yield выполняется, потому что он все же до console.log. Но вот дальше из-за использования неинициализованных переменных будет выброшена ошибка. Да, эту ошибку ваш код успешно перехватывает и давит, но - уже вне цикла. И все - цикл завершен, и генератор с чистой совестью завершает свою работу.
Ошибка же, в рамках моего скромного понимания, там должна там быть какой-то на тему работы с NaN (значение неинециализованной переменной - undefined - при преобразовании в число дает именно NaN). Мне это проверять лень (и вообще я программист ненастоящий), но вы, если вам это было бы любопытно, могли бы даже увидеть и тип, и сообщение об ошибке, если бы вместо того, чтобы давить ошибку с выводом неинформативного текста, вывели бы свойства name и message объекта ошибки (error.name и error.message в вашем случае). Этот совет - он, конечно, на случай, что вы желаете понимать, что там за ошибка. Но, может, вам надо просто убрать ее от юзера с глаз долой, чтобы не мозолила глаза -тогда указанные свойства выводить, конечно, незачем.
Как это имеющееся положение поправить - это я вам не решусь советовать, не зная точно ваших намерений. Если вы хотите, как часто это делается в реальной разработке, замести ошибку под ковер, чтобы не оствечивала (что логично, если вам надо это заставить код работать хоть как-то) чтобы выполнить yield должное количество раз - просто перенесите оператор try/catch внутрь цикла. Кстати запомните этот прием: он обязательно пригодится вам при дальнейшей разработке костылей (правда следите при этом, чтобы цикл все-таки закончился, а то конфуз будет).
Если же вы почему-то решили исправить ошибку, используйте, руководствуясь намеками из предыдущего ответа, правильные имена переменных.
И обязательно пометьте предыдущий ответ: его автор нашел ошибку, о которой он аккуратно вам намекнул, раньше чем я даже просто прочитал ваш вопрос.