以同步的方式管理异步操作(暂停执行的作用),每调用一次返回一个状态,如果是异步操作,则会等待异步操作完成后,继续后续的执行,避免了回调,代码更清晰简洁,方便维护,可能是比promise还要好用。
redux-saga中的异步操作effects,采用了generator函数自动执行机制,所以我们只需要关注请求的发送以及数据最终返回后的回调即可,其余事情redux-saga以及帮我们做好了。
async函数是generator函数的语法糖,将 * 替换成了 async 、yeild 替换成了await 而已。async函数自带执行器。
=====================
2018.05.03再学习阮一峰ES6:
1、generator函数:ES6提供的异步编程解决方案
generator函数可以理解为一个状态机,内部封装了多个状态。
执行generator函数会返回一个遍历器对象,可以一次遍历函数内部的多个状态。
generator函数有2个特征:function* + yeild。
generator函数与普通函数的区别:
generator函数调用后,并不立即执行,返回的是一个遍历器对象,调用遍历器对象的next方法
才会从函数头部或者上次暂停执行的地方开始执行,直到遇到下一个yeild或者return或者函数结束(yeild暂停执行,next恢复执行)。
yeild语句后的表达式,只有调用next方法时才会被执行。
yeild与return的异同:
都是返回后续紧跟着的表达式的值;
但是yeild可以有多个,return只能有一个;
yeild只能用在generator函数里面。
1、yield表达式本身没有返回值,但是可以通过给next方法传参,作为上一个yield表达式的返回值:可以在函数开始运行后,继续向函数内部注入参数
function* gg(){
var x = yield 111;
console.log(x);// 200 第一次执行next即使传值也没用的,第二次执行next传的值才有用
var y = yield x + 100;
console.log(y);// 400
yield y + 100;
}
var g = gg();
g.next();//{value: 111, done: false}
g.next(200);//{value: 300, done: false}
g.next(400);//{value: 500, done: false}
g.next();//{value: undefined, done: true}
generator函数的应用:
1.异步请求的同步化解决方案
2.简化控制流 代码简洁
3.可以用for...of来遍历函数内的值,所以可以作为数据结构
4.可以为任意对象部署iterator遍历接口
网友评论