写过 JS 的都知道 JS/TS 的异步方案采用 async,await,Promise 的无栈协程方案。Python 也是采用的类似方案,但 Python 提供更多的控制包括 cancel 一个 task ,可以尝试提前结束一个异步任务,同时 JS/TS 也没有 current_task 或者类似 Java 的 ThreadLocal 获取上下文变量的方案。
通常的实现中断执行的写法是手动判断类似 AbortSignal.throwIfAborted 的方案,但写起来没那么舒心。
于是我想到是否可以通过改写 Promise.then 实现自动中断 await 执行?实际写下来以后的发现居然真的可以,于是有了下面的这个库。
https://github.com/partic2/protask
https://gitee.com/partic/protask
使用示例:
``` typescript
import {task} from 'protask'
function sleep<T>(milliSeconds: number, arg?: T): Promise<T> {
return new Promise(function (resolve, reject) {
setTimeout(resolve, milliSeconds, arg)
});
}
async function printTaskLocal(){
await sleep(100);
console.info(task.locals());
}
task.create('test task 1',async ()=>{
try{
for(let i=0;i<100;i++){
task.locals()!.count=i;
await printTaskLocal();
await sleep(1000)
}
}catch(e:any){
console.info(e.toString());
}
});
task.create('test task 2',(async ()=>{
await sleep(3000);
console.info('abort task 1')
task.abort('test task 1');
}));
```
上面的代码创建了一个 task1 然后在 task2 中中断了 task1 的运行。同时在 task1 中打印 task local 。
目前只是一个非常简单实验性质的库,并未完善测试过,请注意使用风险。
觉得有意思的话可以点个 star ,万一以后就进 tc39 了呢?(笑 |
|