Я пытаюсь понять, как использовать Promise с генератором. Для этого я создаю вспомогательную функцию для печати async task, но, похоже, я делаю это неправильно.
const asyncTask = () => new Promise((resolve, reject) => setTimeout(() => resolve('async task'), 1000))
function helper(func){
return func().next()
}
helper(function* main() {
try {
const a = yield asyncTask()
console.info(a)
} catch(e) {
console.error('error happened', e)
}
})
Отсутствие вывода.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Я не уверен на 100%, чего вы пытаетесь достичь. Однако, если вы хотите увидеть результат своего промиса, вы должны await его зарегистрировать в консоли. Ваш генератор правильно выполняет ваше обещание, но вы ничего с ним не делаете. Эта альтернативная функция helper() выводит результат:
async function helper(func){
let p = func().next().value;
let output = await p;
console.info(output);
}
Как правило, проще использовать асинхронные генераторы, чем использовать синхронные генераторы, смешанные с другими асинхронными устройствами.
Асинхронный генератор работает так же, как обычный генератор, за исключением:
async, как и все асинхронные функции.next() возвращает обещаниеВот упрощенный пример:
let asyncGen = async function*() {
yield Promise.resolve('foo');
};
let iterator = asyncGen();
iterator.next().then(result => alert(result.value));
(Обратите внимание, что нет никакой разницы между моим Promise.resolve('foo') и вашим более запутанным обещанием с тайм-аутом; оба разрешаются асинхронно — я просто сделал свой пример простым.)
Вы можете узнать больше об асинхронных генераторах в моем руководстве по генераторам из трех частей.
Вы можете посмотреть исходный код co.js, чтобы узнать больше о преобразовании генераторов в промисы.
В пакете c-promise2 также есть поддержка генераторов, решающих:
CPromise.from(function*(){
const value1= yield CPromise.delay(3000, 3);
// Run promises in parallel using CPromise.all (shortcut syntax)
const [value2, value3]= yield [CPromise.delay(3000, 4), CPromise.delay(3000, 5)]
return value1 + value2 + value3;
}).then(function*(value){
console.info(`Done: ${value}`); // Done: 12
}, err=>{
console.info(`Failed: ${err}`);
})
Или просто используйте асинхронные генераторы ECMA...
вы можете это сделать, но вы путаете генераторы и обещания. Я предлагаю вам сначала прочитать учебник о каждом из них в отдельности.