2650.设计可取消函数
链接:2650.设计可取消函数
难度:Hard
标签:
简介:有时候你会有一个长时间运行的任务,并且你可能希望在它完成之前取消它。为了实现这个目标,请你编写一个名为 cancellable 的函数,它接收一个生成器对象,并返回一个包含两个值的数组:一个 取消函数 和一个 promise 对象。
题解 1 - typescript
- 编辑时间:2023-04-24
- 执行用时:64ms
- 内存消耗:42.5MB
- 编程语言:typescript
- 解法介绍:dfs。
function cancellable<T>(generator: Generator<Promise<any>, T, unknown>): [() => void, Promise<T>] {
  let cancel = false;
  function dfs(node) {
    if (node.done) return Promise.resolve(node.value);
    if (node.value instanceof Promise)
      return node.value.then(
        res => (cancel ? dfs(generator.throw('Cancelled')) : dfs(generator.next(res))),
        res => dfs(generator.throw(res))
      );
    else return dfs(generator.next(node.value));
  }
  return [
    () => (cancel = true),
    new Promise<T>((resolve, reject) => dfs(generator.next()).then(resolve, reject)),
  ];
}