yield in js

// yield IE瀏覽器不兼容哦 但是IE edge兼容
// 碰到yield就停止,生成yield對象,對象的value屬性是yield後面的值
function* yieldTest () {
  let array = [5, 4, 3]
  for (let i = 0; i < array.length; i++) {
    yield array[i] // yield使生成器函數暫停執行,yield實際返回的是迭代器對象
  }
}

// 在判斷語句中應用next()會消耗迭代的次數,每次判斷都會消耗
// 如果yield在其他表達式中,需要用()單獨括起來
// 不可以直接傳遞yield值
// console.log('開始構造了')
// console.log(yieldTest)
//
let itemTest = yieldTest()
// console.log(itemTest)

console.log(itemTest.next()) // yield本身沒有返回值(undefined),有返回值的是next(),next可以無限次調用,但是迭代完成後均返回undefined
console.log(itemTest.next()) // yield和next需要配合使用
console.log(itemTest.next()) // 返回兩個參數,一個是返回值,一個是是否完成
console.log(itemTest.next()) // 返回值是undefined時候,才表示已經結束了


function* yieldTry () {
  for (let i = 0; true; i++) {
    var reset = yield i
    if(reset) {
      i = -1
    }
  }
}
let yieldItem = yieldTry()
// console.log(yieldItem.next())
// console.log(yieldItem.next())
// console.log(yieldItem.next())
// console.log(yieldItem.next())
// console.log(yieldItem.next())
// console.log(yieldItem.next())
// console.log(yieldItem.next(true))
// console.log(yieldItem.next(true))
// console.log(yieldItem.next(false))

// 越來越難以理解
function* yieldMath (x) {
  var y = 2 * (yield (x + 1))
  var z = yield(y / 3)
  console.log('x=' + x + ',y=' + y + ',z=' + z)
  return (x + y + z)
  // console.log('final result:' + (x + y + z))
}

// var a = yieldMath(5)
// a.next()
// a.next()
// a.next()
//
// var b = yieldMath(5)
// console.log(b.next())
// console.log(b.next(12))
// console.log(b.next(13))
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章