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