2016-06-13 163 views
1

請讓我知道這是否太模糊的問題,但使用ES6發電機功能與承諾相比有什麼優勢?我目前看不到優勢,希望有人能夠對此有所瞭解。ES6發電機功能與承諾

例如,以異步方式檢索數據時:

/* Using promises */ 
fetch('api-endpoint') 
    .then(resp => response.json()) 
    .then(name => obj.name) 
    .then(x => console.log('Name: ', name)) 

//VS 

/* As a generator function and assuming we have required node-fetch */ 
run(function *() { 
    const url = 'api-endpoint'; 
    const resp = yield fetch(url); 
    const obj = yield response.json(); 
    const name = yield obj.name; 
    console.log("Name available here: ", name); 
} 

function run(genFunc) { 
    const iterator = genFunc(); 
    const iteration = iterator.next(); 
    const promise = iteration.value(); 
    promise.then(x => { 
     const additionalIterator = iterator.next(x); 
     const additionalPromise = iterator.value; 
     additionalPromise.then(y => iterator.next(y)); 
    }); 
} 
+1

它非常含糊。你能否展示你將如何使用它們來做類似的事情? – 4castle

+0

沒問題,會添加一個例子。 –

回答

2

承諾處理異步事件,而發電機組提供書面保持自己的狀態環路和算法的有力工具。

MDN Iterator and generators page

處理每一個集合中的項目是很常見的 操作。 JavaScript提供了很多遍歷集合的方法,從簡單的for循環到map()和filter()。迭代器和 生成器將迭代的概念直接引入到核心 語言中,併爲定製循環的行爲 提供了一種機制。

所以我認爲它們是爲了解決兩個非常不同的問題。

話雖如此,you could use generators instead of promises,就像你的例子,但我不認爲這就是他們的目的。

+0

沒問題,這是一個有用的評論,所以我upvoted它。我只是在處理異步事件方面看待它們,但在處理循環阻塞等問題時,它們似乎更加實用。只是試圖將我的頭圍繞在它們周圍。 –

+0

當然,我自己遠離這個問題的專家。如果它幫助你,你可以繼續接受它;)@DanWeber –