之前做了一次失败的尝试,做了一个 hook Promise 的方案。
https://www.fshex.com/t/1081474
省流说下这个方案失败的原因是 native code 中(例如 fetch)创建的 promise 不会使用 Hooked 的 Promise ,并且 V8 原生 await 实现不会在 onfulfilled 返回前运行 await 后面的代码,只有通过类似 babel 等工具将 await 编译为生成器函数的情况下才行。
后来我把库改回了生成器函数的模式。

昨天突发奇想,想到另一个方案,这个方案我测试在 node 和 chrome 上是可行的。 就是借助 new Function 自定义一个带标记的函数,就可以将标记的函数名插入到 new Error().stack ,就可以区分当前的任务栈,实现 task local,继而也可以通过 hook promise 实现 async 函数中止。虽然和最早方案的表现有一些差异。这个方案经过测试确实是可行的。

但是这个方案只在 V8 测试是生效的,在 txiki.js(quickjs)上 await 的堆栈会丢失。并且在获取当前 task 时有较高的性能损耗,所以只能说仅供参考,没什么实际应用价值

举报· 103 次点击
登录 注册 站外分享
快来抢沙发
0 条回复  
返回顶部