Использование yield в генераторе не гарантирует ожидание, пока обещание не будет выполнено полностью.
Чтобы ваш пример работал, вы должны написать код для вызова следующего метода объекта, который реализует итеративный протокол.
function runGenerator(asyncGen) {
const gen = asyncGen();
let returnValue;
(function iterate(value){
returnValue = gen.next(value);
if(!returnValue.done) {
returnValue.value.then(iterate);
}
})();
}
const object = {
getPastEvents: () => Promise.resolve([1,2,3])
};
runGenerator(function*() {
const values = yield object.getPastEvents();
console.log(values);
});
Обратите внимание, что это просто реализация, вам нужно проверить больше условий, если вы хотите использовать реальные проекты.
Вместо того, чтобы просто реализовывать свои собственные для этого, я бы рекомендовал использовать co module.
Обратите внимание, что Async & Await очень похож на этот подход, они оба требуют многообещающего API.
Однако для использования Async & Await, убедитесь, что ваш движок JavaScript поддерживает, иначе вам нужно выполнить конвейер, чтобы заставить их работать в старых движках.
Но использование генератора будет работать на большинстве современных движков JavaScript, это довольно старая спецификация (ES6).
Также, как правило, передача Async & Await создает много кода, который может быть проблемой, если вы хотите сохранить размер контента, такой же маленький, как possible.
Ключевое отличие ES6 Generator и ES7 Async & Await заключается в том, что ES6 Generator не может использовать «функцию стрелки», которая действительно критична в некоторых ситуациях (вы должны сохранить ссылку «this» где-то перед тем, как попасть в генератор.в контексте функции), однако асинхронная функция ES7 может сделать это.
Обратите внимание, что ES7 Async & Await - это просто синтаксический сахар обещающего API, а генератор ES6 - нет.