refactor: 清掉指向不存在的 Dispatch 的文档,删掉为它留的死导出
Dispatch 在仓库里出现 7 次,全是注释和错误文案,没有任何实现。三处错误文案
写着「需要回调语义请用 Dispatch」——使用者按这句去查会找不到东西,真正该指的
是 WithCall。caller.go 那句还指向不存在的子包 jscriptx/dispatch。
连带删掉四个为它留的导出(全仓库零调用):
Target 统一 Script/Instance 的接口。有未导出方法 owner(),
外部实现不了;也没有任何函数以它为参数或返回值
ErrUnsupportedSignature 哨兵错误,库自己从不产生它
KindSignature 错误分类,全仓库唯一一次出现就是它自己的声明。
留着会让写 switch 的人为一个永不出现的分支写代码
OverlayLoader.Loaders 零调用的 getter,连测试都没有
另外删掉 Instance.IdleFor 和 lastUsed 字段:它是给「空闲回收」用的,而
doc.go 明确写着本库不代管实例生命周期、没有空闲回收——字段注释和包文档直接
对立。代价是每次 Call 白付两次 time.Now() + atomic store。业务侧真要自己回收,
记一个时间戳是一行的事。
caller 的示例原来拿 ErrUnsupportedSignature 当哨兵,改成自己声明一个——
回调签名的约定本来就是调用方定的,哨兵该归调用方。
验证:framework-v2 和 lx-bid 都仍能编译。
This commit is contained in:
@@ -22,8 +22,8 @@ type frame struct {
|
||||
name string
|
||||
}
|
||||
|
||||
// arity 返回 JS 函数声明的形参个数(函数对象的 length 属性),
|
||||
// Dispatch 靠它判断脚本写的是哪种回调形状。
|
||||
// arity 返回 JS 函数声明的形参个数(函数对象的 length 属性)。
|
||||
// WithCall 的回调靠它判断脚本写的是哪种形状,见 Caller.Arity。
|
||||
func (f *frame) arity() int64 {
|
||||
return f.fnVal.ToObject(f.rt).Get("length").ToInteger()
|
||||
}
|
||||
@@ -56,7 +56,7 @@ func empty(v goja.Value) bool {
|
||||
// 传进去的 Go 对象原样回来)。fn 传 DefaultFunc 表示调用脚本自身求值出的那个函数。
|
||||
//
|
||||
// 脚本返回函数/闭包会被拒绝:那种值只在 VM 内部有效,VM 归还池子后再调用会出问题。
|
||||
// 需要把脚本函数当回调用,走 Dispatch。
|
||||
// 需要把脚本函数当回调用,走 WithCall——在 VM 借出期间调,别把函数带出来。
|
||||
func (s *Script) Call(ctx context.Context, fn string, args ...any) (any, error) {
|
||||
return callAny(ctx, s, fn, args)
|
||||
}
|
||||
@@ -84,7 +84,7 @@ func callAny(ctx context.Context, r runner, fn string, args []any) (any, error)
|
||||
}
|
||||
if _, isFunc := goja.AssertFunction(res); isFunc {
|
||||
return newError(KindType, r.owner().name, fn, ErrValueEscape,
|
||||
"返回值是 JS 函数,只在脚本内部有效;需要回调语义请用 Dispatch")
|
||||
"返回值是 JS 函数,只在脚本内部有效;需要回调语义请用 WithCall")
|
||||
}
|
||||
out = res.Export()
|
||||
return nil
|
||||
@@ -104,7 +104,7 @@ func callInto(ctx context.Context, r runner, fn string, out any, args []any) err
|
||||
// 而这个 VM 马上就要还回池子给别的请求用了。
|
||||
if rv.Type().Elem().Kind() == reflect.Func {
|
||||
return newError(KindType, name, fn, ErrValueEscape,
|
||||
"不能把脚本函数导出成 Go 函数(VM 归还池子后它就失效了);需要回调语义请用 Dispatch")
|
||||
"不能把脚本函数导出成 Go 函数(VM 归还池子后它就失效了);需要回调语义请用 WithCall")
|
||||
}
|
||||
|
||||
return invoke(ctx, r, fn, args, func(f *frame) error {
|
||||
|
||||
Reference in New Issue
Block a user