V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
yazoox
V2EX  ›  JavaScript

有没有帮助实现本地顺序执行任务的 queue?

  •  
  •   yazoox · 2021-10-27 09:29:51 +08:00 · 1665 次点击
    这是一个创建于 883 天前的主题,其中的信息可能已经有所发展或是发生改变。

    需求大概是这样滴

    有一个界面,有一颗树,显示各种节点。用户可以点击 /右键任意一个节点,添加 /删除或者重命名,或者选择某节点后,显示一个面板,然后修改属性,等等。
    但是,任意操作后,需要对应修改同一个文件,然后该文件会上传到服务器上(这个操作需要 3~5 秒,比较费时)

    但是,“被要求”,每次修改后,立即执行文件保存并上传的操作(添加一个“保存”按钮,等都修改完成后,再保存提交它不香么?)。这样的话,用户每次操作,都要等待 5 秒,才能执行下一步操作。还不让我们把界面上的菜单灰掉(本来想操作没有执行完,菜单就灰掉,暗示 /强制 用户,现在不能操作)

    所以,问题来了。现在我想使用一个 queue ,有点类似 message queue ,只是这个是本地的(有点像生产 /消费模型)。用户只管在界面上操作,每次动作类型和修改的数据,都添加到这个 queue 里面去。然后,monitor 这个 queue ,有内容了,就取一条,执行操作,保存,上传。然后再去 queue 里面取一条,blabla...

    不知道有没有成熟的 npm package 做这个?还是说,只能再造一个轮子?或者,大家有什么想法?

    谢谢

    p.s.1
    好像 saga 里面有个 event channel ,是类似这样的。我们的环境里面本来就使用了 redux/redux-saga

    可以试试每次用户的操作,emmit 一个消息到这个 channel ,然后这个 channel 里面,循环监听,处理消息,上传文件。

    p.s.2
    react + typescript + redux + redux-saga

    5 条回复    2021-10-27 11:14:00 +08:00
    star7th
        1
    star7th  
       2021-10-27 09:50:03 +08:00
    js 的网络请求不本身就是异步的吗。你不要把动作写在回调函数里面就行。
    shyrock
        2
    shyrock  
       2021-10-27 10:30:10 +08:00
    如果只是把操作串行化,我理解一楼说的就是答案。
    但是,如果后端返回和前端刷新不做串行化的话,有可能点击操作的节点是刚刚刷新出来的新节点,而不是用户当时想点击的节点,这可以接受吗?
    2i2Re2PLMaDnghL
        3
    2i2Re2PLMaDnghL  
       2021-10-27 10:46:14 +08:00
    意思是用户操作得够快两秒进行了 17 次操作,然后就需要 85 秒来上传这 17 次操作?
    不告诉用户正在上传,用户过了十秒把页面关掉了,这剩下的 15 个操作是不是就丢失了?
    maichael
        4
    maichael  
       2021-10-27 11:09:52 +08:00
    “每次修改后,立即执行文件保存并上传的操作”,需求本身就很奇怪,这么高耗时的请求竟然要频繁触发,脑子有洞才会这么设计。

    本身请求就是异步的,不用搞什么队列,不搞阻塞就行了,像 1 楼说的。
    0Vincent0Zhang0
        5
    0Vincent0Zhang0  
       2021-10-27 11:14:00 +08:00
    把这些要提交到服务器上的动作打包成消息,然后放入队列中,再加上一个 setTimeout 来处理这个动作消息队列,提交到服务器上,这样就能提高用户的使用体验了。
    如果这个用于上传队列内容的 function 能够如果能一定程度上对队列中的内容进行合并的话,就可以减轻服务器的压力了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3153 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 12:40 · PVG 20:40 · LAX 05:40 · JFK 08:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.