迭代器和可迭代协议
- 解决副作用的redux中间件
- redux-thunk:需要改动action,可接收action是一个函数。
- redux-promise:需要改动action,可接收action是一个promise对象,或者action的payload是一个promise对象。
- 以上两个中间件会导致action或action创建函数不在纯净。
- redux-saga将解决这样的问题,它不仅可以爆出action,action创建函数,reducer的纯净,而且可以模块化的解决副作用,并且功能非常强大。
- redux-saga是建立在ES6的生成器基础上,要熟练的使用saga,必须理解生成器。
- 要理解生成器,必须先理解迭代器和可迭代协议。
迭代
1.类似于遍历
遍历:有多个数据组成的几个数据结构(map, set, array等其他类数组),分别依次取出每一个数据然后对每一个数据进行处理
2.迭代:按照某种逻辑,依次取出下一个数据进行处理
迭代器(iterator)
- JS语言特性,如果一个对象具有next方法,并且对next方法满足一定的约束,就该对象可以称之为迭代器
- next方法约束:该方法必须返回一个对象,该对象至少具有两个属性
-value:any类型,下一个数据的值,如果done的值为true,一般设置最后一个数据的value值为undefined
-done:下面是否可以迭代
var iterator = {
a: 1,
b: 2,
indexCurrent: 1,
next() {
if (this.indexCurrent == 1 || this.indexCurrent == 2) {
this.indexCurrent++;
return {
value: 1,
done: false
}
}
var c = this.a + this.b
this.a = this.b;
this.b = c
this.indexCurrent++;
return {
value: c,
done: false
}
}
}
可迭代协议
ES6中出现for-of循环,该循环就是用于迭代某个对象的,因此,(for-of)循环要求对象必须满足可迭代协议
- 可迭代协议是用于约束一个对象的,如果一个对象满足下面的规范,则该对象满足可迭代协议,也称之为该对象是可以被迭代的。
-可迭代协议约束如下:
1.对象必须有一个知名符号属性(Symbol.iterator)
2.该属性必须是一个无参的迭代器创建函数
for-of循环原理
调用对象的[Symbol.iterator]方法,得到一个迭代器,不断调用next方法,只有返回done为false时,则将返回的value值传给变量,然后进入循环体执行一次
var iterator = {
[Symbol.iterator]: function () {
return {
a: 1,
b: 2,
indexCurrent: 1,
next() {
if (this.indexCurrent == 1 || this.indexCurrent == 2) {
this.indexCurrent++;
return {
value: 1,
done: false
}
}
var c = this.a + this.b
this.a = this.b;
this.b = c
this.indexCurrent++;
return {
value: c,
done: this.indexCurrent > 20
}
}
}
}
}
for (const item of iterator) {
console.log(item);
}