V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  pursuer  ›  全部回复第 2 页 / 共 17 页
回复总数  326
1  2  3  4  5  6  7  8  9  10 ... 17  
@nomagick 测试了下还真是,我发布的第一个有 BUG 的版本在被 tsc 编译为 yield 模拟 await 的代码里是正常运行的。使用原生 js 的 await 时,onfulfilled 的行为有点奇怪,不会立即运行 await 后面的代码。尝试 queueMicrotask 和 Promise.then 清除 currentTask 均不能按预期位置运行,唯一稍微可用方案是 setTimeout(0)但存在可能 4ms 限制且这个也不能确定执行时间点,只能在较大程度上缓解 currentTask 泄漏到其他 Promise 的问题。
@nomagick 推了新版本解决了这个 BUG ,原来是我脑抽本地两份代码撤销的时候不一致了。

不过就像我前面说的,当前写法会导致 task 标记泄露污染不在 taskMain 里创建的 Promise ,不够完美。但目前想不到更好的办法了。
@nomagick 浏览器上复现了你的问题,初步推断原因是 onfulfilled 后的代码被放到下一 tick 运行了,虽然可以简单通过移除
finally{task.currentTask='';}解决,但可能造成 task 泄露,我还得再看下
@nomagick
使用同一版本依然无法复现问题。。。用的 windows x64 ,运行你给的代码如下

sh-3.1$ node -v
v20.11.1
sh-3.1$ npm run build && npm run test

> [email protected] build
> tsc


> [email protected] test
> node dist/index.js

task 1 running
{}
task 1 running
{}
task 1 running
{}
abort task 1
Task 1 error
AbortError: This operation was aborted
Task 1 finally
@nomagick 我这边有 node 和 Chrome 测试是正常的,输出是
{ count: 0 }
{ count: 1 }
{ count: 2 }
abort task 1
AbortError: This operation was aborted
不知道你那边用的什么运行时,可能哪里还有瑕疵,试试看 task.locals.count 赋值删除能不能抛出异常?
@nomagick 抛出异常符合预期的,Python 也是抛出 CancelError ,只有抛出异常才能保证类似 try{}finally 的资源正常释放。
因为我是用了 super.then 的,所以原本 promise 的内部处理应该遵照原有的实现,只是在 onfulfilled 前检测中止状态,转为调用 onrejected
@nomagick 这个方法确实比较 hacky ,里面也可能埋藏着尚未发现的坑,所以我也指明这是一个实验性的项目。只是有时候确实想要个这样的控制 async/await 运行流的工具,不知道 tc39 以后会不会搬出类似的东西。
@nomagick Promise 不会 pending ,abort 的情况会直接传递到 onrejected ,抛出 AbortError 。在 taskMain 函数返回后会做 task 的清理工作。当然,如果 taskMain 返回后有其他继承同一 task 的 Promise 尝试访问 task 上下文会得到 undefined ,这算是一个小问题。
@nomagick 实现 Python 的 cancel 类似的机制,中断异步传递抛出异常,同步代码都是没法中断的,确实像你说的可以魔改为 await 为 iterator 模式, 但我写的这个方法可以不用魔改 js 就可以实现这个效果。
85 天前
回复了 Aspector 创建的主题 分享发现 最近看了一本讲 NT 内核开发过程的书
异步 IO 是很明显的需求,当然要是讨论 IOCP 和 select/epoll 那可能 IOCP 确实好一点,但说到底异步在没有实现无栈协程的 C/C++上不管怎么写都会比较难受
如果要兼容低版本就有影响,所以我一般考虑尽量不引入第三方库然后改为嵌入 Webview ,至少 Android5.0 可以支持到 Chrome89 左右的版本,对前端框架一般是够了。Android 用了类似 jvm 的 runtime ,结果 runtime 却不能像 jvm 那样单独升级,奇怪的设计
109 天前
回复了 MXXXXXS 创建的主题 游戏 尝试更多的武器
rogue like 游戏,每局拿到的东西都不一样,需要按照当前有的东西做最优选择。
118 天前
回复了 jlak 创建的主题 Go 编程语言 写 Go 真的好爽
@jlak Go 能写的类型约束 TS 都能写,TS 能写的 Go 不一定能,说“Go 类型系统比 TS 好”没道理的。当然你要说 Go 简单那确实简单,不过对我来说有 TS 的复杂度可以接受。
123 天前
回复了 CoderLim 创建的主题 游戏 SpaceWaves 一款网页小游戏
这就是把几何冲刺里的 WAVE 模式拆出来成单独的游戏了吧。。画风也很像
搜了下果然 monaco-editor ,现在编辑器是不是 monaco-editor 就最好用?
1  2  3  4  5  6  7  8  9  10 ... 17  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1027 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 26ms · UTC 23:08 · PVG 07:08 · LAX 15:08 · JFK 18:08
Developed with CodeLauncher
♥ Do have faith in what you're doing.