【问题标题】:JavaScript function signatures in WebSharperWebSharper 中的 JavaScript 函数签名
【发布时间】:2016-08-17 11:21:04
【问题描述】:

我正在为 WebSharper 创建一个 ampify.js 绑定。 (https://github.com/aph5nt/websharper.amplifyjs)。在测试我的扩展时,我发现发布/订阅实现存在一个问题。

我声明了一个订阅处理程序:

let subscribeFn (data:obj) = JS.Alert(data :?> string)

我创建了一个订阅:

Amplify.Amplify.Subscribe("tryPubSub", subscribeFn)

当我想退订时,我会这样做:

Amplify.Amplify.Unsubscribe("tryPubSub", subscribeFn)

问题在于,subscribeFn 被翻译成 2 个不同的函数。 如果我调试 js 代码并检查 amplify.js 库下发生了什么,那么我会得到以下信息:

//this is what has been saved when I created a subscription
subscriptions[ topic ][ i ].callback
(L){return i.subscribeFn(L);}
.
//this is what was passed as a callback for the unsubscribe function
callback
(S){return i.subscribeFn(S);} 

逻辑上没有区别,但参数不同,因此我无法取消订阅。

【问题讨论】:

  • 不是角度专家,但是让 subscribeFn 使用像 let subscribeFn = fun (data:obj) -> JS.Alert(data :?> string) 这样的 lambda 怎么样?
  • @JohnPalmer,我试过了,结果是一样的

标签: javascript f# websharper amplifyjs


【解决方案1】:

WebSharper 3 无法将模块函数的调用优化为函数值(在引号中表示为 lambda),因此它成为每个调用站点上的新函数。

解决方案是将模块函数捕获为本地函数值:

let subscribeFn = fun (o: obj) -> subscribeFn o

(WebSharper 4 beta 已经有这个优化。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-02
    • 2018-07-25
    相关资源
    最近更新 更多