RxJs试炼

可以使用https://stackblitz.com进行在线代码编写

1.数组的RxJs使用

  • 直接输出数组

    const array = ['2',3,4,'5','a','aa','c','dd','Jack'];
    const result = array;
    console.log(result);
    // 控制台会直接输出 ["2", 3, 4, "5", "a", "aa", "c", "dd", "Jack"]
    
  • 使用RxJs每隔500毫秒输出一个数组值

    const array = ['2',3,4,'5','a','aa','c','dd','Jack'];
    const source = interval(500).pipe(
      take(array.length),
      map(i=>array[i])
    );
    source.subscribe(v=>console.log(v))
    // 控制台会每隔500毫秒输出一个数组值
    

2.RxJs中对Dom事件的处理

  • 使用Js的方式实现点击页面按钮间隔一秒以上才输出事件

    • html

      <button id="btn">Click me</button>
      
    • ts

      import { interval } from 'rxjs'; 
      import { map, take } from 'rxjs/operators';
      
      const btn = document.getElementById('btn');
      let preTime = new Date().getTime();
      btn.addEventListener('click', (event)=>{
        const nowTime = new Date().getTime();
        const silence = nowTime-preTime;
        if(silence>1000) {
          preTime = nowTime;
          console.log(event);
        }
      });
      
  • 使用RxJs的方式实现间隔一秒以上才输出事件

    • html

      <button id="btn">Click me</button>
      
    • ts

      import { fromEvent } from 'rxjs'; 
      import { throttleTime } from 'rxjs/operators';
      
      const btn = document.getElementById('btn');
      const obs = fromEvent(btn, 'click').pipe(
        throttleTime(1000)//使用throttleTime操作符表示设置间隔的时间
      );
      obs.subscribe(v=>console.log(v));
      

3.使用语句声明的方式获取值

使用RxJs最大的好处是使得我们能够完全依赖于声明语句来获得动态的值

  • 使用Js的方式获取变化后的变量值

    let a = 4;
    let b = a*10;
    console.log(b);//40
    a = 5;
    console.log(b);//40 说明b不会实时获取到a的值从而发生变化
    
  • 使用RxJs的方式实时获取变化后的变量值

    import { interval } from 'rxjs'; 
    import { map } from 'rxjs/operators';
    
    const a = interval(1000).pipe(//每个1秒处理一次
      map(_=>Math.random().toFixed(1))
    );
    const b = a.pipe(
      map(item=>item*10)
    );
    b.subscribe((item)=>console.log(item));//此时b每个一秒都会输出随机值*10
    

4.使用RxJs处理网络请求

  • 需求:每隔3秒发送一下请求,且每当用户点击按钮的时候也发送请求

  • 分别将每个3秒的事件封装成流,将用户点击事件封装成流

  • 通过merge操作符将流合并,并通过mergeMap上述事件流触发时要执行的内容

  • 通过subscribe监听流并获得返回值

  • 实例代码

    • html

      <button id="btn">Click me</button>
      
    • ts

      import { interval, fromEvent, from, merge } from 'rxjs'; 
      import { mergeMap } from 'rxjs/operators';
      
      const btn = document.getElementById('btn');
      const click = fromEvent(btn, 'click');
      const inner = interval(3000);
      const request = from(fetch('https://api.github.com/users').then(res=>res.json()));
      const response = merge(//用来合并事件,当任意一个事件触发时都会执行mergeMap操作
        click,
        inner
      ).pipe(
        mergeMap(_=>request)//当合并事件流触发时执行的操作
      );
      response.subscribe((res)=>console.log(res));//输出请求的结果内容
      // 每隔3秒发送一下请求,且每当用户点击按钮的时候也发送请求
      

5.试炼总结

  • 响应式优点:使用声明语句来获取动态的值,语义化,状态隔离
  • 响应式思维:Everything is observable; 无论是数组,DOM事件还是网络请求,都可以被抽象成按时间序列发生的事件
发布了258 篇原创文章 · 获赞 332 · 访问量 13万+

猜你喜欢

转载自blog.csdn.net/qq_34829447/article/details/97486357