2016-08-17 32 views
4

我正在爲WebSharper創建ampify.js綁定。 (https://github.com/aph5nt/websharper.amplifyjs)。在測試我的擴展時,我發現發佈/訂閱實現有一個問題。WebSharper中的JavaScript函數簽名

我宣佈訂閱處理程序:

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

我創建了一個訂閱:

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

當我想退訂,然後我做的:

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

的問題是, subscribeFn被翻譯成2種不同的功能。 如果我調試JS代碼,並檢查什麼amplify.js的lib下發生的事情,然後我得到如下:

//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);} 

有一個在邏輯沒有區別,但ARG遊戲不同,因爲我是無法取消訂閱。

+0

不是一個角的專家,而是做什麼subscribeFn使用lambda like'let subscribeFn = fun(data:obj) - > JS.Alert(data:?> string)' –

+0

@JohnPalmer,我試過了,結果是一樣的 – aph5

回答

1

WebSharper 3無法將對模塊函數的調用作爲函數值(在引用中用lambda表示)進行優化,因此它將成爲每個調用站點上的新函數。

一個解決辦法是捕捉模塊功能作爲本地函數值:(WebSharper 4測試版已經有這個優化)

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

+0

謝謝,這是正確的解決方案! – aph5