关于两次输出NaN,对应的 yield 语句
来源:4-11 异步编程解决方案Generator(上)
永远幸运
2022-01-29
老师您好:
关于这段代码,我不太懂,第二次输出的 NaN 到底是在第一个 yield(x + 1) 就终止了,还是第二个 yield(y / 3) 终止的。
function* gen(x) {
let y = 2 * (yield(x + 1))
let z = yield(y / 3)
return x + y + z
}
let g = gen(5)
console.log(g.next()) // 6
console.log(g.next()) // NaN 这里没懂,第二次输出的 NaN 到底是在第一个 yield 就终止了,还是第二个。
console.log(g.next()) // NaN
写回答
1回答
-
谢成
2022-02-03
首先需要了解next方法的使用方式:调用next方法时,会从当前 yield 之后的语句继续执行,直到下一个 yield 位置暂停。next() 返回一个包含 value 和 done 属性的对象。value 属性表示本次 yield 表达式返回值,done 表示后续是否还有 yield 语句。
g.next() // Object{value:6, done:false}
// 运行next方法的时候不带参数,导致 y 的值等于2 * undefined(即NaN)
g.next() // Object{value:NaN, done:false}
// 除以 3 以后还是NaN,因此返回对象的value属性也等于NaN
g.next() // Object{value:NaN, done:true}
00
相似问题