Сигнатуры функций JavaScript в WebSharper

Я создаю привязку ampify.js для WebSharper. (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);} 

Разницы в логике нет, но аргументы разные и из-за этого я не могу отписаться.


person aph5    schedule 17.08.2016    source источник
comment
Не специалист по угловым, но как насчет того, чтобы заставить subscribeFn использовать лямбду, например let subscribeFn = fun (data:obj) -> JS.Alert(data :?> string)   -  person John Palmer    schedule 17.08.2016
comment
@JohnPalmer, я пробовал с этим, и результат тот же   -  person aph5    schedule 17.08.2016


Ответы (1)


WebSharper 3 не может оптимизировать вызовы функций модуля как значение функции (которые представлены в цитате как лямбда), поэтому он становится новой функцией на каждом сайте вызова.

Решение состоит в том, чтобы зафиксировать функцию модуля как локальное значение функции:

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

(В бета-версии WebSharper 4 эта оптимизация уже есть.)

person Jand    schedule 22.08.2016