2650. 设计可取消函数
2025年6月25日小于 1 分钟
2650. 设计可取消函数
function cancellable<T>(
generator: Generator<Promise<any>, T, unknown>
): [() => void, Promise<T>] {
let cancelled = false
const cancel = () => {
cancelled = true
}
const promise = new Promise<T>(async (resolve, reject) => {
try {
let result = generator.next()
while (!result.done) {
await result.value
if (cancelled) return reject('Cancelled')
result = generator.next()
}
if (cancelled) return reject('Cancelled')
resolve(result.value)
} catch (err) {
if (cancelled) return reject('Cancelled')
reject(err)
}
})
return [cancel, promise]
}