迭代器和可迭代协议

本文探讨了Redux-Saga如何解决副作用问题,保持action及reducer的纯净性。基于ES6生成器,深入讲解了迭代器和可迭代协议的基础概念及其在JavaScript中的实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

迭代器和可迭代协议

  • 解决副作用的redux中间件
  1. redux-thunk:需要改动action,可接收action是一个函数。
  2. redux-promise:需要改动action,可接收action是一个promise对象,或者action的payload是一个promise对象。
  3. 以上两个中间件会导致action或action创建函数不在纯净。
  4. redux-saga将解决这样的问题,它不仅可以爆出action,action创建函数,reducer的纯净,而且可以模块化的解决副作用,并且功能非常强大。
  5. redux-saga是建立在ES6的生成器基础上,要熟练的使用saga,必须理解生成器。
  6. 要理解生成器,必须先理解迭代器和可迭代协议。

迭代
1.类似于遍历
遍历:有多个数据组成的几个数据结构(map, set, array等其他类数组),分别依次取出每一个数据然后对每一个数据进行处理
2.迭代:按照某种逻辑,依次取出下一个数据进行处理

迭代器(iterator)

  1. JS语言特性,如果一个对象具有next方法,并且对next方法满足一定的约束,就该对象可以称之为迭代器
  2. 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. 可迭代协议是用于约束一个对象的,如果一个对象满足下面的规范,则该对象满足可迭代协议,也称之为该对象是可以被迭代的。
    -可迭代协议约束如下:
    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);
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值