/

javascript-generators

#JavaScript生成器教程

生成器是一種特殊類型的函數,具備自我暫停和稍後恢復的能力,從而允許其他代碼在此期間運行。

生成器是一種特殊類型的函數,具備自我暫停和稍後恢復的能力,從而允許其他代碼在此期間運行。

代碼決定自己需要等待,所以它讓“隊列中的其他代碼”運行,並保留當“它等待的東西”完成時恢復操作的權利。

所有這些都是通過一個簡單的關鍵字yield完成的。當生成器包含該關鍵字時,執行被暫停。

生成器可以包含多個yield關鍵字,因此可以多次暫停,並且通過*function關鍵字進行標識,不要將其與用於低層次編程語言(如C,C ++或Go)的指針解引用運算符混淆。

生成器使得在JavaScript中實現全新的編程範式成為可能,包括:

  • 在生成器運行時的雙向通信
  • 長壽命的循環不會凍結您的程序

以下是解釋它們如何工作的生成器的示例。

1
2
3
4
5
function \*calculator(input) {
var doubleThat = 2 \* (yield (input / 2))
var another = yield (doubleThat)
return (input \* doubleThat \* another)
}

使用以下方式初始化它:

1
const calc = calculator(10)

然後在生成器上啟動迭代器:

1
calc.next()

第一次迭代開始運行迭代器。代碼返回以下對象:

1
2
3
4
{
done: false
value: 5
}

發生的情況是:代碼運行函數,並將input = 10作為傳遞給生成器構造函數的參數。它運行直到達到yield語句,並返回yield的內容:input / 2 = 5。因此,我們獲得了一個值為5的結果,並且告知迭代尚未完成(函數僅暫停)。

在第二次迭代中,我們將值7傳遞進去:

1
calc.next(7)

返回的結果是:

1
2
3
4
{
done: false
value: 14
}

7被設置為doubleThat的值。重要的是:你可能會認為input / 2是參數,但這只是第一次迭代的返回值。我們現在跳過它,並使用新的輸入值7,乘以2。

然後我們到達第二個yield,返回doubleThat的值,因此返回值為14

在下一個(也是最後一個)迭代中,我們傳入100:

1
calc.next(100)

返回的結果是:

1
2
3
4
{
done: true
value: 14000
}

因為迭代已完成(找不到更多的yield關鍵字),我們只返回(input * doubleThat * another) ,即10 * 14 * 100