通常的实现中断执行的写法是手动判断类似 AbortSignal.throwIfAborted 的方案,但写起来没那么舒心。
于是我想到是否可以通过改写 Promise.then 实现自动中断 await 执行?实际写下来以后的发现居然真的可以,于是有了下面的这个库。
https://github.com/partic2/protask
https://gitee.com/partic/protask
使用示例:
import {task} from 'protask'
function sleep(milliSeconds: number, arg?: T): Promise {
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{
await sleep(3000);
console.info('abort task 1')
task.abort('test task 1');
}));
上面的代码创建了一个 task1 然后在 task2 中中断了 task1 的运行。同时在 task1 中打印 task local 。
目前只是一个非常简单实验性质的库,并未完善测试过,请注意使用风险。
觉得有意思的话可以点个 star ,万一以后就进 tc39 了呢?(笑