Generator.prototype.next()

Baseline 已廣泛支援

此特性已非常成熟,可在多種裝置和瀏覽器版本上使用。自 ⁨2016 年 9 月⁩以來,它已在各大瀏覽器中可用。

next() 方法是 Generator 例項的一個方法,它會返回一個包含 donevalue 兩個屬性的物件。你也可以向 next 方法傳遞一個引數,用於向生成器傳送值。

語法

js
next()
next(value)

引數

value 可選

要傳送給生成器的值。

該值將被賦給 yield 表示式的結果。例如,在 variable = yield expression 中,傳遞給 .next() 函式的值將被賦給 variable

返回值

一個包含兩個屬性的 Object

done

一個布林值。

  • 如果生成器已完成其控制流,則為 true。在這種情況下,value 指定生成器的返回值(可能為 undefined)。
  • 如果生成器能夠產生更多值,則為 false
value

生成器產生或返回的任何 JavaScript 值。

異常

TypeError

如果生成器已在執行,則丟擲錯誤。

示例

使用 next()

下面的示例展示了一個生成器以及 next 方法返回的物件

js
function* gen() {
  yield 1;
  yield 2;
  yield 3;
}

const g = gen(); // Generator { }
g.next(); // { value: 1, done: false }
g.next(); // { value: 2, done: false }
g.next(); // { value: 3, done: false }
g.next(); // { value: undefined, done: true }

使用 next() 處理列表

在此示例中,getPage 接收一個列表,並將其“分頁”成大小為 pageSize 的塊。每次呼叫 next 都會產生一個這樣的塊。

js
function* getPage(list, pageSize = 1) {
  for (let index = 0; index < list.length; index += pageSize) {
    yield list.slice(index, index + pageSize);
  }
}

const list = [1, 2, 3, 4, 5, 6, 7, 8];
const page = getPage(list, 3); // Generator { }

page.next(); // { value: [1, 2, 3], done: false }
page.next(); // { value: [4, 5, 6], done: false }
page.next(); // { value: [7, 8], done: false }
page.next(); // { value: undefined, done: true }

向生成器傳送值

在此示例中,next 使用一個值進行了呼叫。

注意: 第一次呼叫不會記錄任何內容,因為生成器最初沒有產生任何內容。

js
function* gen() {
  while (true) {
    const value = yield;
    console.log(value);
  }
}

const g = gen();
g.next(1); // Returns { value: undefined, done: false }
// No log at this step: the first value sent through `next` is lost
g.next(2); // Returns { value: undefined, done: false }
// Logs 2

規範

規範
ECMAScript® 2026 語言規範
# sec-generator.prototype.next

瀏覽器相容性

另見