Миграция с генераторов на асинхронный / ожидающий

Я только что пришел к мучительному осознанию того, что функции генератора нельзя использовать с await. Только обещания или асинхронные функции.

Моя команда создала целое приложение со всеми модулями, состоящими из функций генератора, с одним вызовом модуля Co из основного файла js.

Помимо того, чтобы идти через сотни функций генератора и менять их из function*(...){ в async function(...){Как еще можно заставить генераторы работать с async/await?

Не имеет смысла, потому что yield*/generator и async / await очень похожи в том, как они обрабатывают поток, поэтому мне интересно, как они упустили возможность ждать генераторы поддержки.

3 ответа

Решение

Вы должны пройти через свою кодовую базу и изменить ее, да (конечно, вы можете написать / использовать инструмент, который сделает все за вас).

Но вы можете сделать это постепенно, если хотите: Замените function* от async functionвнутри него каждый yield от await и каждый yield* от await co(…), а затем изменить каждый вызов бывшей функции генератора из co(…) в …(),

Нет необходимости мигрировать из одного в другой, потому что async функции и co Библиотека может сосуществовать в мире.

async функции могут быть использованы внутри co генераторные функции, они просто обещающие функции:

co.wrap(function* () {
    yield asyncFn(1);
})()
.catch(console.error);

Функции генератора могут быть использованы внутри async функции:

(async function () {
    await co(genFn(1));
    // for generator functions with no arguments, can also be 
    await co(genFn);
})()
.catch(console.error);

Помимо перехода к сотням функций генератора и замены их из функции *(...){на асинхронную функцию (...){, как еще можно заставить генераторы работать с async/await?

Учитывая, что генераторы используются в приложении только в сочетании с co, они могут быть заменены в автоматическом режиме. function* а также * методы заменяются async коллеги, yield а также yield* заменены на await,

Прежде чем это можно будет сделать, необходимо выполнить предварительный рефакторинг. Только обещания и генераторы должны использоваться из этого списка доходности. Параллельное выполнение (массивы и объекты) следует заменить соответствующими Promise.all:

const results = yield [...];

в

const results = yield Promise.all([...]);

Если кому-то нужна дополнительная информация о переходе от co к асинхронной функции, вот подробная статья о миграции: https://medium.com/@nivekz/migrate-from-co-to-async-functions-4635d32d12bf

Другие вопросы по тегам