Миграция с генераторов на асинхронный / ожидающий
Я только что пришел к мучительному осознанию того, что функции генератора нельзя использовать с 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