WebSharper 中的 JavaScript 函数签名

标签 javascript f# websharper amplifyjs

我正在为 WebSharper 创建一个 ampify.js 绑定(bind)。 (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);} 

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

最佳答案

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

一个解决方案是将模块函数捕获为局部函数值:

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

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

关于WebSharper 中的 JavaScript 函数签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38995244/

相关文章:

asp.net-mvc - 我应该学习 NHaml 吗?

compiler-errors - 错误: Type constraint mismatch when applying the default type 'int * int' for a type inference variable [duplicate]

f# - 使用回车键提交

javascript - 动态构建表时事件在 JQuery 中不起作用

javascript - 文件未定义

f# - 您可以在创建类型提供程序之前运行代码吗? (F#)

f# - WebSharper:不透明类型,具有 `===` 的相等性检查

javascript - 使用 jQuery 更改 div 类

javascript - Angular UI 警报在 IE 8 上不起作用

javascript - 在 WebSharper 中的整数类型之间转换