跳到主要内容

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)),
];
}