| 从上例中我们看出手动迭代Generator 函数很麻烦,实现逻辑有点绕,而实际开发一般会配合 co 库去使用。co是一个为Node.js和浏览器打造的基于生成器的流程控制工具,借助于Promise,你可以使用更加优雅的方式编写非阻塞代码。 安装co库只需:npm install co 上面例子只需两句话就可以轻松实现 function* r() {    let r1 = yield read('./1.txt')    let r2 = yield read(r1)    let r3 = yield read(r2)    console.log(r1)    console.log(r2)    console.log(r3)  }  let co = require('co')  co(r()).then(function(data) {    console.log(data)  })  // 2.txt=>3.txt=>结束=>undefined 
 我们可以通过 Generator 函数解决回调地狱的问题,可以把之前的回调地狱例子改写为如下代码: function *fetch() {      yield ajax(url, () => {})      yield ajax(url1, () => {})      yield ajax(url2, () => {})  }  let it = fetch()  let result1 = it.next()  let result2 = it.next()  let result3 = it.next() 
 七、async/await 1.Async/Await简介 使用async/await,你可以轻松地达成之前使用生成器和co函数所做到的工作,它有如下特点: 
     async/await是基于Promise实现的,它不能用于普通的回调函数。 async/await与Promise一样,是非阻塞的。 async/await使得异步代码看起来像同步代码,这正是它的魔力所在。 一个函数如果加上 async ,那么该函数就会返回一个 Promise async function async1() {    return "1"  }  console.log(async1()) // -> Promise {<resolved>: "1"} 
 Generator函数依次调用三个文件那个例子用async/await写法,只需几句话便可实现 let fs = require('fs')  function read(file) {    return new Promise(function(resolve, reject) {      fs.readFile(file, 'utf8', function(err, data) {        if (err) reject(err)        resolve(data)      })    })  }  async function readResult(params) {    try {      let p1 = await read(params, 'utf8')//await后面跟的是一个Promise实例      let p2 = await read(p1, 'utf8')      let p3 = await read(p2, 'utf8')      console.log('p1', p1)      console.log('p2', p2)      console.log('p3', p3)      return p3    } catch (error) {      console.log(error)    }  }  readResult('1.txt').then( // async函数返回的也是个promise    data => {      console.log(data)    },    err => console.log(err)  )  // p1 2.txt  // p2 3.txt  // p3 结束  // 结束 
 2.Async/Await并发请求 (编辑:南平站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |