VueJS异步与并发管理

VueJS异步与并发管理(插件Vue-Concurrency)

异步与并发,是前端程序员在日常编程中难以绕开的话题,本文介绍一个用于封装异步操作与管理并发的Vue插件:Vue-Concurrency。

Vue-Concurrency旨在为异步操作的执行和取消提供合理的抽象,它减少了样板代码,提供了可靠的派生状态,并为节流,反跳,轮询等技术提供了新的方法。

先看看它是怎么使用的:

Task是 Vue-Concurrency 中的核心对象,可把它看作是可取消、可重启的异步操作。上图代码中,通过装饰器(Decorator)、Generator函数的方式定义了一个名为"myTask"的Task对象,在Vue组件的JS代码和模板里都可以使用它。

Task可以像Async函数一样被调用,调用时可以向它传递不同的参数。与直接调用Async函数不同,需要调用perform方法来执行Task。

前端开发中常用到的实现异步操作的方式是使用Promise和Async函数,为什么要使用Task来定义异步操作呢?

原因是Promise和Async函数都存在一个痛点:无法取消。比如,Async函数一旦开始执行,就会一直执行下去,无法从外部中止它。相比之下,Task的最大特点就是它支持取消。如下图:

上图中,在Task运行过程中,调用cancelAll,可以从当前运行到的yield中断点中止任务的运行,被取消后,后面的代码都不会运行。

Task是可以取消的异步操作,这让异步操作更可控,为管理异步操作的生命期提供了基础。同时,可取消的异步操作也是管理并发的前提,这个我们后面详细介绍。我们先来看看异步操作生命周期的管理。

异步操作的生命周期管理

前面说到,使用Async函数来实现异步操作的一个问题是:Async函数运行后无法从外部中止它,这会使管理异步操作的生命周期变得困难。

试想一下,在一个Vue单页面应用中,当一个页面触发了异步操作,如果这个操作很耗时,用户在等待过程中跳转到了其它页面,系统会如何处理这个异步操作呢?

实际上,在异步操作运行的过程中如果触发异步操作的组件被移除了,异步操作仍会一直执行,直到执行完成或报错退出。这在绝大多数情况下被认为是一种资源浪费和内存泄露,尤其是在这个异步操作中存在多个异步操作步骤串行的情况下。

下面这个"10秒倒计时"的例子直观地演示了这个问题:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qXBdvWzK-1634624196994)(https://dn-zbj-boss.qbox.me/@/default/2021-09-09/6139a420e8206.gif)]

例子中通过Async函数实现10秒倒计时的功

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值