V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  nomagick  ›  全部回复第 3 页 / 共 24 页
回复总数  463
1  2  3  4  5  6  7  8  9  10 ... 24  
@itskingname 你这属于好的,只是当时稍微烦一下子,要是他看的技术是纸上谈兵怎么办,金玉其外败絮其中怎么办,

天天上班一边捏鼻子一边给擦屁股,这受得了吗
自己在网上看了两篇文章,就一意孤行
比喜欢找外部咨询更恐怖的是,不知道找外部咨询
翻译一下,就是把 C++程序员裁了之后 v8 引擎写不动了,一些有的没的语法糖,你们 JS 程序员自己实现就好,别来我这产生人力成本了
360buy
59 天前
回复了 punish19 创建的主题 随想 愚孝是心理疾病了吧?
文革长大的一代多少有点心理问题,理解为主,主要是你也没有任何办法
59 天前
回复了 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 之后选择是否往下游返回,没有中断任何代码的执行,掩耳盗铃了属于是
。。。缓慢打出一个问号 ❓
66 天前
回复了 tmkook 创建的主题 分享发现 避雷 yeelight
啥品牌 10 年质保呢,这公司能给自己保十年不。。

都是 LED 给惯的毛病,从前没有 LED 照明灯的时候,还 10 年,10 个月就阿弥陀佛了
1  2  3  4  5  6  7  8  9  10 ... 24  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2326 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 23ms · UTC 15:56 · PVG 23:56 · LAX 07:56 · JFK 10:56
Developed with CodeLauncher
♥ Do have faith in what you're doing.