RxJs

脚本加载 = 脚本下载 + 执行

一般是同时 下载4个js文件 依次执行先返回的js文件

回调地狱 问题

一个变量 什么时候变化 你是很难跟踪的

try...catch 是没有用的

   try{
       a = 1/b
   }catch(error){
       a = 100
   }
   console.log(a) //100

必须 在真正执行的地方 try catch

如果 你监听了一个函数 这个函数会不会一直存在呢
这个函数 一直在内存里 就叫 内存泄露

let febIterator = ()=>{
    let array = [0,1]
    let index = 0
    return{
        next(){
            let value = array[index]
            if(array[index] === undefined){
                array[index] = array[index-1] + array[index-2]
                value = array[index]
            }
            index += 1
            return {
                value: value,
                done:false
            }
        }
    }
}

let fi = febIterator()
fi.next()      0
fi.next()      1
fi.next()      1
fi.next()      2
fi.next()      3
fi.next()      5

迭代器 可以 用来 懒计算 你问我的时候 我 再计算

var febIterator2 = function*(){
    let array = [0,1]
    let index = 0
    while(true){
        let value = array[index]
        if(array[index] === undefined){
            array[index] = array[index-1] + array[index-2]
            value = array[index]
        }
        index ++
        yield value
    }
}
var fi2 = febIterator2()

代码不会一直执行吗 不会的
它会每次 yield 之后 就停下来 等待你下次调动 next()

如果你不调用 next() 我这个 while 循环 是不会进入下一次循环的

观察者模式 /发布订阅模式 -----平时的事件监听

迭代器 主动要求 变化

观察者 被动接受 变化

观察者模式 按钮 在迭代 开发者 按钮在把你 当做迭代器用

人把按钮 当做 被观察的物体 我们是观察者 是开发者被 next() 了

按钮在主动 通知你

button onclick observe.next()

一个 getTopRatedFilms 函数
传入一个 user

获取它的 videoLists
遍历一下 把lists 里面的videos 过滤下
找出评分为5分的
得到的是多个数组
拍扁 concatAll

执行函数 遍历结果 打印出来

一个 getElemenetDrags 函数

传入一个 元素el

获取它的 mouseDowns //记录下 用户所有时间段 鼠标点击的事件
遍历一下 把 mouseDown s 里面的 mouseDown 做一个映射
每个mouseDown 之后有一系列的 mouseMove
关联它之后所有 mouseUp 之前的 有效mouseMoves 事件
得到的是多个数组 //数组里多个 有效的 mouseMove 事件
拍扁 concatAll

执行函数 遍历结果 获取鼠标移动的位置 把元素的位置 变为鼠标的位置

为了便于 捕获错误

在成功的回调后 添加 错误回调 结束回调

很像 promise 里的 then 但是 rxjs 提供了 更多的 操作 // 50多个

concatAll
{
    ...{1},
    .........{2............3},
    ............{},
    ..................{4}
}

同时记时
一段时间 先发射1 完了记录下一个
一段时间 发射2 还没完 继续记录
一段时间 有个空值 先放到缓存 先不发射 完了 记录下一个
一段时间 有个4 先放到缓存 先不发射 完了 记录下一个
继续记录发射完2 之后 的值
一段时间 发射3 完了 查看缓存里的值
第一个是空 不发射 完了 查看下一个
马上 发射4

输入框 提示

1、依次发射abcde 发几个请求?

1个 用函数防抖 过滤

2、竟态问题 跑步的问题 race condition

1 先跑 2 后跑

谁先到终点 不知道 我哪知道 谁跑的快啊

可以用 取消请求api 解决
一旦发送第二个请求 前面的这个请求 就要 手动的取消订阅

在rxjs里 不需要取消订阅 只要你告诉我 收集到哪里为止 takeUntil

定义一个迭代器

用户按的所有按键
函数防抖 250ms 250ms以内 有重复的按键 我就把 最后一次按键 发请求

遍历 发射的值 ------每次debounce结束之后 给我发送的值
我就用 getJson 请求
请求的值是 input的 value

我们请求 是不是 有可能失败啊
retry(3) 如果你 发送请求失败了 自动重新发送 最多发送3次 要是 还是失败 就不管了
有的时候 你不需要重发
什么时候啊
当用户 又开始按键的时候

我的请求 需要一段时候响应 响应的时候 就会更新UI
当用户 又开始按键的时候 这里就有一段 劫持

如果你的请求还没有成功 用户就又按键了 这个响应 不要了
什么时候要呢 用户又开始 按键之前 你已经响应了

abc 会对应一个c 一个c会对应 像abc的请求 一个请求 会对应成一个响应
这个响应会更新我们的UI 如果这个响应慢了 就不要了 因为用户又输入了一次值
最终 把所有的响应 concat进来

每次响应 更新UI
如果出错了 就给用户显示下 出错信息
如果没有出错 就对每一个响应 updateUI

----------a-b-c------------d-e-------------f----------->


-------------------c--------------e-------------f---------->

 
--------------------abc------------abcde----------abcdef---->

回到最初的代码

播放一部电影
首先 把播放器初始化 一下
然后播放的时候 我要看 用户能不能播放

首先player 初始化
初始化成功后 发射一个值
监听用户的 播放尝试 ---- 用户点击播放按钮 用户按了下回车 用户按了下空格
对每次尝试 我要回去下 moveId
然后对电影进行建权
失败就重试 最多3次
如果用户取消了 我就 takeUntil

如果建权成功了 我们会拿到电影票
每次播放 会尝试拿它的 电影票
如果拿到电影票了 就把所有的电影票合起来

对每一次电影票 就拿播放器 播放
怎么可能有 三个电影票 都是在 同一个播放器里 播放的啊
播完第一个 播第二个

你可能感兴趣的:(RxJs)