2017-08-28 103 views
3

我有發電機如何在while循環中使用generator.next()?

function* pendingPage() { 
    let value = 1; 
    while (true) 
     yield getPage(value++); 
} 

getPage()功能

async function getPage(value) { 
    const page = await service.getValidations(value); 
    (page.data.customers.length === 0) ? service.isCustomersFinished = false : console.log(page.data.customers); 
} 

我有,而下面的語法無限循環:

let generator = pendingPage() 
while(true){ 
    generator.next(); 
} 

而且我想用它裏面generator.next()功能。但發電機不起作用。

我試過了for循環,它工作正常。

那麼,它有什麼問題以及如何在無限while循環中使用generator.next()

+0

什麼是'generator'? – Bergi

+0

你如何期望永遠擺脫無限循環?當然無限循環不起作用,無論他們調用什麼方法。 – Bergi

+0

你的[實際問題](https://meta.stackexchange.com/q/66377)是什麼?你爲什麼使用發生器和無限循環? – Bergi

回答

2

而且我想用裏面的generator.next()函數。

在這裏絕對沒有理由使用發電機。普通代碼

{ 
    let value = 1; 
    while (true) { 
     getPage(value++); 
    } 
} 

與調用pendingPage生成器完全相同,並且將其永久迭代。

那麼,它有什麼問題呢?

這是一個無限循環。那就是問題所在。它將永遠呼叫getPage,並阻止整個過程從事其他任何事情。如果這裏的所有內容都是同步的,那麼這就是你想要的,但注意getPage和特定的service.getValidations是異步的。阻止的一切包括阻止異步回調的發生,這就是爲什麼你沒有得到任何日誌。隨着一個有界的for循環,迭代在某一點結束,回調有機會被調用。

我想檢索信息並將它放到console.log中。我想用generator生成async/await和infinite while循環。

忽略生成器 - 它不是異步的。你只能用async/await和無限循環做到這一點:

(async function() { 
    let value = 1; 
    while (true) { 
     await getPage(value++); 
    } 
}()); 

這仍然是一個無限循環,但它的懸掛在每個await允許其他事情發生。

+0

非常感謝您的解釋! – Remzes

+0

你能否給我一個關於最後一個函數或源代碼的解釋,我可以在那裏讀到它 – Remzes

+0

@Remzes它只是一個[IIFE](https://stackoverflow.com/questions/592396/what-is-the -a-self-executed-function-in-javascript)做了'async',允許我們在其內部使用'await'語法。例如,請參閱[ES8立即調用異步函數表達式](https://stackoverflow.com/q/40745153/1048572)。 – Bergi