我正在为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是不同的,因此我无法取消订阅。
答案 0 :(得分:1)
WebSharper 3不能将对模块函数的调用优化为函数值(在引号中表示为lambda),因此它成为每个调用站点的新函数。
解决方案是将模块函数捕获为本地函数值:
let subscribeFn = fun (o: obj) -> subscribeFn o
(WebSharper 4测试版已经进行了此优化。)