通过迭代获取生成器的返回值

时间:2019-04-12 03:33:08

标签: javascript node.js generator coroutine

我很难调和这两个:

const gen = function *() {
  yield 3;
  yield 4;
  return 5;
};

const rator = gen();

console.log(rator.next());  //  { value: 3, done: false }
console.log(rator.next());  //  { value: 4, done: false }
console.log(rator.next());  //  { value: 5, done: true }

上面我们看到了所有3个值,如果我们第四次调用next(),则会得到:

{ value: undefined, done: true }

这很有意义。但是现在,如果我们在循环中使用它:

for(let v of gen()){
  console.log('next:', v); // next: 3, next: 4
}

我想我感到困惑,为什么使用for循环不打印next: 5,但是在迭代器上手动调用next()可以得到return的值。谁能解释这是为什么?

换句话说,我希望for loop打印next: 5,但不会打印。

2 个答案:

答案 0 :(得分:0)

为了保持一致性,这似乎行得通吗?

const gen = function *() {
  yield 3;
  yield 4;
  return yield 5;
};

return关键字现在似乎什么也没做。

答案 1 :(得分:0)

返回的值包含在exception.value中,其中exception是生成器实例返回时生成器实例抛出的StopIteration。

示例:

def generator_function():
    yield 0
    yield 1
    return "text"

value_list = []
exception_list = []
try:
    a = generator_function()
    while True:
        value_list.append(next(a))
except StopIteration as e:
    exception_list.append(e)

print(value_list)
print(exception_list)
print(type(exception_list[0]), exception_list[0])
print(type(exception_list[0].value), exception_list[0].value)

另请参见Generator with return statement