2017-01-10 51 views
7

我剛剛來到痛苦的認識,發電機功能不能用於等待。只承諾或異步功能。從發電機遷移到異步/等待

我的團隊使用由發生器函數組成的所有模塊構建了一個完整的應用程序,並從主js文件調用了Co模塊。

除了通過數百個生成器函數並將它們從function*(...){更改爲async function(...){之外,還有什麼方法可以使生成器能夠使用異步/等待?

沒有意義,因爲yield */generator和async/await在處理流程方面非常相似,所以我想知道他們是如何錯過等待支持生成器的。

+1

僅供參考,'async/await'不是ES7的一部分。 –

+1

另外,如果你想重寫大部分的代碼庫,請考慮使用一個工具來做到這一點,如果可能的話:https://github.com/facebook/jscodeshift(免責聲明:我寫了它) –

+0

遷移的原因是什麼? –

回答

5

你必須通過你的代碼庫並改變它,是的(當然,你可能會寫/使用一種工具來爲你做所有事情)。

但是,如果你願意,你可以逐漸做到這一點:替換function*通過async function,裏面每一個yield通過awaityield*通過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); 

除了要去雖然數百個生成器函數,並將它們從函數*(...){更改爲異步函數(...){,如何將它們更改爲 lse可以使發生器 與async/await一起工作嗎?

考慮到應用程序中使用的發生器只能與co一起使用,它們可以以自動方式進行替換。將function**方法替換爲async對應部分,將yieldyield*替換爲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