WebSharper中的JavaScript函数签名

时间:2016-08-17 11:21:04

标签: javascript f# websharper amplifyjs

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

我宣布订阅处理程序:

<link rel="stylesheet" href="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/themes/smoothness/jquery-ui.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/jquery-ui.min.js"></script>

<div id="dialog" title="Basic dialog">
  
</div>
 

我创建了一个订阅:

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

当我想取消订阅时,我会这样做:

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

问题在于,subscribeFn被翻译成2个不同的功能。 如果我调试js代码并检查在amplify.js lib下发生了什么,那么我得到以下内容:

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

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

1 个答案:

答案 0 :(得分:1)

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

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

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

(WebSharper 4测试版已经进行了此优化。)