最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • Rxjs TENET 问题解析

    正文概述 掘金(字节跳动数据平台前端团队)   2021-02-03   566

    豆皮粉儿们,大家好,又见面了。

    Rxjs TENET 问题解析

    众所周知,RxJS是非常流行的前端响应式异步编程框架,其丰富的操作符为异步编程带来了无限可能,但是数据平台的“阳羡”同学却遇到了观察值反向流动的问题,下面这篇文章讲述了问题的起因与解决过程。

    引言

    rxjs 一直是解决复杂异步问题的最优解,它能够把值像魔法一样在 Observable 间流动,但是最近我遇到了一个问题,发现值竟然能够反向流动,就像 TENET 中一样,非常不合常理。

    问题代码

    为了定位问题,我写了一个最小复现 demo,以下代码订阅了一个 Subject 并打印当前的值,问题是,打印的结果是什么?

    codesandbox.io/s/lucid-alm…

    Rxjs TENET 问题解析

    打印的结果是:

    1. 1

    2. 2

    3. 3

    是这样的吗?

    然而实际结果却是:

    1. 3

    2. 2

    3. 1

    天啊,怎么可能,难道我穿越到 信条TENET 去了?为什么输出会反着来?

    深入分析

    为了深入探究这个问题,我们一起来写一个最小 Subject

    Rxjs TENET 问题解析

    在实现过程中需要注意一点

    rxjs是复杂异步解决方案,但是本质上是同步的

    同时在问题代码中,第一个 subscribe 加上 sub1 开头的 log,第二个 subscribe 加上 sub2 开头的 log

    结果如下

    1. sub1 1

    2. sub1 2

    3. sub1 3

    4. sub2 3

    5. sub2 2

    6. sub2 1

    再简化下,最终就是一个简单的递归模型

    Rxjs TENET 问题解析

    再画出堆栈图

    Rxjs TENET 问题解析

    这样就很简洁明了了

    解决办法

    回到最初的问题,如果我们想让 App 中的值顺序输出,可以有哪些解决办法呢?

    核心思路就是使用微任务,建立一个新的 task 从而不使用当前堆栈

    方法一:

    使用 setTimeout

    Rxjs TENET 问题解析

    方法二:

    使用 delayoperator

    Rxjs TENET 问题解析

    或者其他的类似方案

    总结

    遇见问题不要慌张,把复杂问题给最小化,最后发现就是一个简单问题,而解决最小简单问题的方案通常就是最终解决复杂问题的方案。

    The     End

    参考链接:Rxjs TENET解析


    起源地下载网 » Rxjs TENET 问题解析

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元