2017-01-10 2 views
7

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

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

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

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

+1

FYI, 'async/await' не является частью ES7. –

+1

Кроме того, если вы хотите переписать большие части базы кода, подумайте об использовании инструмента, чтобы сделать это, если это возможно: https://github.com/facebook/jscodeshift (отказ от ответственности: я написал его) –

+0

В чем причина миграции ? –

ответ

5

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

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

3

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

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); 

Кроме того происходит, хотя сотни функций генератора и их изменение от функции * (...) {до асинхронной функции (...) {, как e Генераторы lse могут быть созданы для работы с async/await?

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

Перед этим можно сделать предварительный рефакторинг. Должны использоваться только обещания и генераторы от this list of yieldables. Параллельное выполнение (массивы и объекты) должны быть заменены соответствующими Promise.all:

const results = yield [...]; 

в

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

Где находится «co»? – delete

+1

@delete От https://github.com/tj/co. Я добавил ссылку на ответ. Угадайте, что это отвечает на вопрос, который вы только что опубликовали. – estus