异步编程(Asynchronous) - 13 Promise - Generator生成器的使用-2

改写执行器函数

function ajax(url) {
  // Promise接受一个函数作为参数,这个函数接受2个参数 (resolve函数/reject函数)
  return new Promise(function (resolve, reject) {
    var xhr = new XMLHttpRequest()
    xhr.open('GET', url)
    xhr.responseType = 'json'
    xhr.onload = function () {
      if (this.status == 200) {
        console.info('Success!')
        resolve(this.response)
      } else {
        console.info('Error!')
        reject(new Error(this.statusText))
      }
    }
    xhr.send()
  })
}

// 生成器函数
function* main() {
  try {
    const users = yield ajax('/api/users.json')
    console.info('users', users)
    const posts = yield ajax('/api/posts.json')
    console.info('posts', posts)
    const urls = yield ajax('/api/urls.json')
    console.info('urls', urls)
    const urls1 = yield ajax('/api/urls11.json')
    console.info('urls1', urls1)
  } catch (e) {
    console.info(e)
  }
}

// 生成器的 >>>> 执行器函数
function co(generator) {
  // 获取生成器对象
  const g = generator()
  // 生成器函数的执行器
  function handleResult(result) {
    if (result.done) return // 生成器函数结束
    result.value.then(data => {
      handleResult(g.next(data)) // 上一次请求的结果作为next参数传递并执行下一次next操作,在实际应用场景中.这个data可能是下一次调用的参数
    }, error => {
      g.throw(error)
    })
  }
  handleResult(g.next())
}

// 将生成器函数直接传入执行器函数,在其内部获取生成器对象
// const g = main()
co(main)
posted @ 2020-08-19 21:11  荣光无限  阅读(92)  评论(0)    收藏  举报