V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
V2EX  ›  pursuer  ›  全部回复第 4 页 / 共 19 页
回复总数  376
1  2  3  4  5  6  7  8  9  10 ... 19  
@lee88688
我后续改的版本就是用生成器函数(yield)实现的,和 redux saga/co 一样,但是这个和原生 async/await 不兼容,就不怎么实用了。
@Opportunity
patch 只考虑浏览器可能可行,只是很麻烦,但是如果是 node 环境下感觉就 patch 不完了
2024 年 11 月 12 日
回复了 XIVN1987 创建的主题 C C 中可变参数如何直接传递到 printf()
我觉得 C 中缺少两个机制,一个是动态函数调用,类似 libffi 。另一个是简单的栈切换,类似 ucontext 。这两个东西依赖 C 的 ABI ,又有不少上层应用需要这个特性,特别是 ffi 。不知道会不会有一天被加入标准库。
2024 年 11 月 11 日
回复了 zhouhuab 创建的主题 程序员 反向代理后的端口数量限制
有的反代可能支持使用 Unix Domain Socket 或 Windows Named Pipe ,虽然我觉得最好的方案还是服务都能支持一个连接复用的网关模型。
2024 年 11 月 3 日
回复了 Mohanson 创建的主题 程序员 对于 WebAssembly 2.0 的一些看法
wasm 最初的目的是在浏览器中使用,加速编解码之类的,所以有 SIMD 是很顺理成章的。但是 wasm 应该支持特性探测,允许运行时实现不支持部分高级特性。
空安全可以通过高级语言实现,倒也不必一定要在 wasm 层面纠结,但是我是没懂为什么每种引用类型需要用一个单独的 table
2024 年 10 月 30 日
回复了 xiaopeng 创建的主题 分享创造 新上线小游戏: Sprunki, https://sprunki.im/
感觉是我第"10086"次看到这个类型游戏的变种发在 V 站?想知道是不是哪个项目拿这个游戏当例子了。。。
2024 年 10 月 29 日
回复了 qiayue 创建的主题 分享创造 预告一个小产品,让天下没有难上的站
有点类似 github pages ,但是我觉得你需要考虑下为什么 gitee pages 停止服务了
2024 年 10 月 29 日
回复了 TheBlind 创建的主题 分享创造 FinalShell 替代者 TShell
用了 Graalvm 真是意外,不过我看到 node-pty 以及任何 gyp 相关库也是会头皮发麻
2024 年 10 月 28 日
回复了 humbass 创建的主题 程序员 好奇问下,类似特斯拉这种车机界面是用什么写的
@xiaofeilongyy555 C/C++的问题还是太容易写挂了,悬垂指针,或者内存 UAF,Double Free 就可能炸穿整个程序而且稍不注意就可能踩坑了。其他语言好歹 try catch 一下可能只是部分功能异常。
2024 年 10 月 20 日
回复了 passive 创建的主题 Windows 谁能举个例子, Win11 究竟哪儿不好用了?
我都是把任务栏挂右边的,结果 win11 把这个功能砍了可还行。。。
@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 就可以实现这个效果。
1  2  3  4  5  6  7  8  9  10 ... 19  
About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   1290 Online   Highest 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 37ms · UTC 17:21 · PVG 01:21 · LAX 10:21 · JFK 13:21
♥ Do have faith in what you're doing.