Асинхронные генераторы в Javascript: есть ли разница между получением обещания и получением ожидаемого обещания? - PullRequest
0 голосов
/ 10 сентября 2018

Я смотрю на асинхронные генераторы, предложенные в 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 в том же выражении или я упустил что-то важное?

1 Ответ

0 голосов
/ 10 сентября 2018

Один интересный аспект объединения ожиданий и доходности заключается в том, что ожидание не может помешать возврату обещания, но оно может помешать выполнению этого обещания:

async function* asyncGenerator() {
    console.log('Start');
    const result = await doSomethingAsync(); // (A)
    yield 'Result: '+result; // (B)
    console.log('Done');
}

ES2018: асинхронная итерация от доктора Акселя Раушмайера

...