| 
                         从上例中我们看出手动迭代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并发请求                         (编辑:泰州站长网) 
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! 
                     |