写了一个有趣的 JS/TS 的任务管理库,可以帮助您中止异步函数/Promise 运行

查看 41|回复 3
作者:pursuer   
写过 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
使用示例:
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 了呢?(笑
rppig42   
👍
有正经这个需求的可以了解下 RxJS
nomagick   
不是这样的,你这没有作用。。
主动中断同步代码目前只能通过操作系统,中断线程或中断进程
主动中断异步代码,可以通过 iterator 在 yield 的节点中断,但在 js 语法之外需要魔改
你这只是在上游 then 之后选择是否往下游返回,没有中断任何代码的执行,掩耳盗铃了属于是
pursuer
OP
  
@nomagick 实现 Python 的 cancel 类似的机制,中断异步传递抛出异常,同步代码都是没法中断的,确实像你说的可以魔改为 await 为 iterator 模式, 但我写的这个方法可以不用魔改 js 就可以实现这个效果。
您需要登录后才可以回帖 登录 | 立即注册

返回顶部