Я смотрю на асинхронные генераторы, предложенные в ES9, чтобы можно было понять логику.
Поскольку каждое возвращаемое значение используется в качестве свойства значения в возвращаемом объекте, заключенном в Promise, из вызова next ():
async function * asyncGen() {
yield 1;
yield 2;
}
let asyncIterator = asyncGen();
asyncIterator.next(); // Promise fullfilled with {value: 1, done: false}
asyncIterator.next(); // Promise fullfilled with {value: 2, done: false}
Я думал, что это верно и для обещаний:
async function * asyncGen() {
yield Promise.resolve(3);
yield new Promise(done => setTimeout(done, 10000));
}
let asyncIterator = asyncGen();
asyncIterator.next();
// Expected: Promise fullfilled with {value: Promise fullfilled with 3, done: false}
// Get: Promise fullfilled with {value: 3, done: false}
asyncIterator.next();
// Expected: Promise fullfilled with
// {value: Promise pending for 10 seconds, then fullfilled with undefined, done: false}
// Get: Promise pending for 10 seconds,
// then fullfilled with {value: undefined, done: false}
Итак, обещания объединены. Звучит неплохо, но я этого не ожидал из-за:
async function * asyncGen() {
yield await Promise.resolve(3);
yield await new Promise(done => setTimeout(done, 10000));
}
let asyncIterator = asyncGen();
asyncIterator.next(); // Promise fullfilled with {value: 3, done: false}
asyncIterator.next();
// Promise pending for 10 seconds,
// then fullfilled with {value: undefined, done: false}
Здесь объединение более разумно, потому что await не может остановить генератор, next () вызов должен вернуть Promise. Но это Обещание может быть выполнено только тогда, когда ожидаемое Обещание в генераторе выполнено.
Итак, является ли ключевое слово await совершенно бесполезным, используется с ключевым словом yield в том же выражении или я упустил что-то важное?