2017-05-05 47 views
1

隨着類似以下的迭代器:如何有條件地停止JavaScript生成器?

function* idMaker(){ 
    let index = 0; 
    while(index < 3) 
     yield index++; 
} 

我怎樣才能確保過早停止基於條件的發電機?

function* idMaker(){ 
    let index = 0; 
    while(index < 3) 
     if (checker(index)) 
      yield index++; 
     else 
      return; 
} 

可以在發電機中使用嗎?我應該使用break而不是yield break也許就像在C#中一樣?

你可以在MDN或規範的討論中加入一個鏈接嗎?

+1

終止函數的任何東西都可以工作。我不認爲這方面有什麼最佳做法。 –

回答

0

我決定用下面的代碼用實驗來驗證這一點:

function checker(i) { 
    return i !== 2; 
} 

function* idMakerReturn(){ 
    let index = 0; 
    while(index < 3) 
     if (checker(index)) 
      yield index++; 
     else 
      return; 
} 

function* idMakerBreak(){ 
    let index = 0; 
    while(index < 3) 
     if (checker(index)) 
      yield index++; 
     else 
      break; 
} 

const a = idMakerReturn(); 
console.log('1', a.next()); 
console.log('2', a.next()); 
console.log('3', a.next()); 

const b = idMakerBreak(); 
console.log('1', b.next()); 
console.log('2', b.next()); 
console.log('3', b.next()); 

從何時爆發了兩種變體正確返回{ "done": true, "value": undefined }。我也通過觀察推斷的函數類型來檢查這與TypeScript。

function* idGen(seed: string | undefined) { 
    if (!seed) { 
    return; // Or `break` 
    } 

    const something = seed.trim(); 
} 

隨着return一切正常,和函數返回類型爲IterableIterator<T>

隨着break我被要求提供一個標籤跳轉到,也something不再推斷爲安全訪問(只是string因爲undefinedif處理),但仍然是一個string | undefined

這使我得出這樣的結論,因爲菲利克斯說,任何終止發電機功能將正確產生done: true項目,但似乎return是可取的,因爲逃跑分析它的工作原理,而它與break不一樣。

在這方面還沒有找到正式的詞,但它對我來說已經夠好了。

1
+0

我特別關心'yield'語法及其在生成器實現中的等價內容以解決它。 –

+0

您是否認爲正常情況下使用發生器內的產量,獲取對發生器的引用,然後停止發生器從外部檢查條件並調用返回值? – quirimmo

+0

這是一個很好的建議,但我正在尋找圖書館的使用,因此生成器不需要將任何責任推送到呼叫站點。 –