21 条回复  ·  652 次点击
amlee 小成 2024-7-13 21:39:03
https://developer.mozilla.org/en-US/docs/Web/API/AbortSignal

有一个 AbortSignal ,似乎可以做到,看下上面那个链接里面的 implementing_an_abortable_api  这一节
iidear2015 小成 2024-7-14 00:06:07
感觉你逻辑挺合理的,好像只能写个工具方法重构一下

```
// 一个 task 包含多个异步 job
// 每个 job 运行前需要校验当前 task 是否在运行
// 运行新 task 时取消之前的 task

const createScheduler = (jobs) => {
  let runningTask = 0;

  const run = async () => {
    runningTask += 1;
    const thisTask = runningTask;

    for (let job of jobs) {
      if (thisTask === runningTask) {
        await job();
      } else {
        return;
      }
    }
  };

  return run;
};

const init = createScheduler([
  () => sleep(500),
  () => sleep(500),
  () => sleep(500)
]);

```
jones2000 小成 2024-7-14 00:09:09
做一个任务队列,输入一次,移除上一次剩余的没有完成的任务,再往队列里面加一组异步的任务, 异步的任务处理从任务队列里面取。
edward1987 初学 2024-7-14 09:49:58
也可以简单的写个装饰函数,把所有异步任务的函数都装饰一遍再调用
function trans(funcN){
  return function(...args){
    if(state!==current){return};
    return funcN(...args)
  }
}
然后重新赋值每个异步任务函数
funcA = trans(funcA);
funcB= trans(funcB);
yigefanqie 小成 2024-7-15 11:02:46
没太理解业务场景,这不应该是给用户输入的事件加 debounce 的事吗
nzbin 小成 2024-7-15 13:30:30
只要是异步,毫无疑问 rxjs 就是更好的处理方式
ddch1997 小成 2024-7-15 15:10:19
我是用 redux-saga ,fork 一个异步 task 任务,然后 take 一个停止 action ,cancel 掉这个 task 任务就好
cjd6568358 小成 2024-7-15 21:01:04
把所有的串行异步用 promise.then 链式连接起来。对外暴露 promise,每次用户有新输入调用 promise.reject 终止异步任务链。然后生成新的
RabbitDR 小成 2024-7-15 21:40:29
@yigefanqie 不一样,他是想取消并行的初始化,防抖不会取消函数的执行。比如连续输入 abc 后 abc 三次输入被防抖了,开始初始化,但这时用户再输入 d ,会进行第二次初始化,他想第二次初始化时如果第一次还在初始化则中止第一次的初始化。
tsanie 小成 2024-7-17 09:24:04
@yigefanqie #28 一般初始化都是资源占用型过程,最佳实践还是直接中断。

不过对 op 提到的 CancellationToken 有些疑问,token 自身是无法 Cancel 的,只能通过 IsCancellationRequested 获取终止状态或者调用 ThrowIfCancellationRequested() 在被终止时抛出异常,和 js 中的 AbortSignal 是一样样的( aborted, throwIfAborted())

可以主动调用 Cancel 的是 CancellationTokenSource ,对应在 js 中是 AbortController
返回顶部