V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
V2EX  ›  nomagick  ›  全部回复第 14 页 / 共 35 页
回复总数  682
1 ... 10  11  12  13  14  15  16  17  18  19 ... 35  
❮ ❯
自己在网上看了两篇文章,就一意孤行
比喜欢找外部咨询更恐怖的是,不知道找外部咨询
2024 年 10 月 26 日
回复了 ChrisFreeMan 创建的主题 › 程序员 › 面对日渐膨胀的语言特性, Google 打算 fork JS
翻译一下,就是把 C++程序员裁了之后 v8 引擎写不动了,一些有的没的语法糖,你们 JS 程序员自己实现就好,别来我这产生人力成本了
2024 年 10 月 25 日
回复了 akorn 创建的主题 › Apple › 大家有什么产品或者服务,初看特讨厌,结果越用越香的?
360buy
2024 年 10 月 24 日
回复了 punish19 创建的主题 › 随想 › 愚孝是心理疾病了吧?
文革长大的一代多少有点心理问题,理解为主,主要是你也没有任何办法
2024 年 10 月 24 日
回复了 Pepsigold 创建的主题 › 职场话题 › 帮忙选一下 offer,国内国外都有!
楼主加油,我的 offer 还在等待国务院批准
我这边是 node.js 20.11.1
我觉得可能和原生 async function 有关,如果是原生的 async function 你这个 hack 就中断不了,但如果是 babel 之类的编译器模拟出来的,打断 then 链条就可以。
不啊,你这言之凿凿的都给我整不自信了,你这真的是没有中断任何代码的执行,而是你的 cancel 操作,造成了 task.locals.count 的赋值失败,这产生了
TypeError: Cannot set properties of undefined (setting 'count')

这才中断了执行,如果你不操作 task.locals ,task1 就会一直运行下去
```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;
console.log('task 1 running');
await printTaskLocal();
await sleep(1000);
}
console.log('Task 1 resolve');
} catch (e: any) {
console.log('Task 1 error');
console.info(e.toString());
} finally {
console.log('Task 1 finally');
}
});

task.create('test task 2', (async () => {
await sleep(3000);
console.info('abort task 1');
task.abort('test task 1');
}));
```
不对,我真的下载下来运行了。

复写 then 不足以中断执行流,你的 example 之所以能够 work 是因为 `task.locals()!.count=i;` 这句在 cancel 之后抛了异常,起到了 abort error 的效果。。。
@pursuer 打扰了,看起来真的可以,进入了我的知识盲区,原来复写 promise.then 就能中断执行流,那我就比较好奇了,async function 原本的那个 promise 后来怎么样了,这个 promise 是不是吊起来了
@nomagick 哦,对不起,是我搞混了
@pursuer 没有啊,在 cancel 的情况,不是 reject 的情况 https://github.com/partic2/protask/blob/b22d446a33cf47e34f3aa4e6d4244185aa75d9cf/src/index.ts#L57-L60
你在这 catch 了之后没有做任何操作,Promise 就吊在这了,这也是你能看起来中断执行的所在
@pursuer 所以你至少在 cancel 之后需要 reject cancel error, 这样下游的代码路径才能继续结算,所以下游也需要再在某个地方 catch cancel error ,对代码的入侵性不亚于显式 if (await jobCancelled) return;

说到底对代码执行流程的操作,还是要交给语言和运行时层面去解决,如果一个函数流程,是不是被完整执行,还可以被外部代码莫名其妙地影响,这对整个系统来讲完全就是一个灾难
@pursuer 不一样,通过 iterator 实现代码是中断了的,运行时知道现在代码已经 throw 或者 return ,但你现在这样,通过 hack 阻止 Promise 结算,Promise 是一直吊在 pending 状态的,运行时也不知道你这部分代码不会再执行了,只知道 Proimse 没有 resolve 。

具体运行时有没有足够聪明能够解开这个泄漏局我不太了解,总之你这操作非常危险,很有可能解不开,而且即便能解开,我看你代码一旦 cancel, 因为你阻断了 Promise 结算,所以 cleanup 的步骤就永远不会执行,但你对这些 AbortSignal 却有全局的引用,这部分也会泄露。
不是这样的,你这没有作用。。

主动中断同步代码目前只能通过操作系统,中断线程或中断进程
主动中断异步代码,可以通过 iterator 在 yield 的节点中断,但在 js 语法之外需要魔改

你这只是在上游 then 之后选择是否往下游返回,没有中断任何代码的执行,掩耳盗铃了属于是
2024 年 10 月 17 日
回复了 viarotel 创建的主题 › 分享创造 › Cleants:开历史的倒车,但至少我是认真的
。。。缓慢打出一个问号 ❓
2024 年 10 月 17 日
回复了 tmkook 创建的主题 › 分享发现 › 避雷 yeelight
啥品牌 10 年质保呢,这公司能给自己保十年不。。

都是 LED 给惯的毛病,从前没有 LED 照明灯的时候,还 10 年,10 个月就阿弥陀佛了
2024 年 9 月 30 日
回复了 651794071 创建的主题 › 职场话题 › 靠家里关系进央国企心里觉得别扭,求建议
@nomagick 实际情况等于是公司托关系找的我, 进去之后别人没有懂的,进去搞科普正时弊挑大梁
1 ... 10  11  12  13  14  15  16  17  18  19 ... 35  
❮ ❯
About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1164 Online   Highest 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 23ms · UTC 23:13 · PVG 07:13 · LAX 16:13 · JFK 19:13
♥ Do have faith in what you're doing.