給postmessage加上callback方法

2022-04-12 02:02:40 字數 1645 閱讀 3079

postmessage雙向通訊中,是不能使用**函式的。

window.postmessage(})

這樣是不行的,js會提示function不會被轉殖。

我猜啊因為postmessage是通過dom通訊,js物件會被json化

也就是說不能傳遞方法。

不過,話說回來,有什麼不能的呢,大不了,把function tostring一下,也是可以傳過去的。

那這裡就要考慮你傳callback是幹什麼用了,如果是作為一種自定義 的資料處理方法,你就tostring一下,過去隨便用用就好了,就好像foreach那樣,傳乙個方法,在foreach內部用用。

如果就是想要得到返回值,讓自己的書寫比較連續。業務邏輯比較連續,callback的結果不會再傳到對面。也就是說,callback始終是在本window下執行的。

保持業務邏輯連續的在你所寫的方法裡,不會因為呼叫postmessage而把業務處理邏輯跳躍到onmessage裡。

這是我要在這裡討論的。

1.很顯然,callback從來沒真正被傳遞到對面window裡。

2.callback將在onmessage(addlistoner裡註冊的接收事件)裡執行。

3.基於以上兩點 ,可以得出很簡單的結論。在本window裡快取callback,等onmessage接收到對面發回來的資料時,用callback處理即可。

話有點兒繞嘴,分步來一次,應該會更清楚一點。

1.用postmessage發訊息給對面。

2.對面收到訊息,處理,

3.用postmessage給本地發訊息。

4.本地接收到訊息,處理

那麼本地要用callback去處理,要知道用的是哪個function去處理。那麼本地有乙個指向callback的變數,就可以得到該callback。

而因為通訊不可能只一次,該callback會被放在陣列裡,同時會用唯一性id來標示它,而這個標示 也將被告訴對面window,再讓對面告訴本地,從而,本地的接收事件中,去呼叫這個function。

還是繞,

寫一下**吧,也許**一目了然。

對面的接收單元

window.addeventlistener("

message

", function(e)

//打一杯可樂

var res = '

返回的可樂

'window.postmessage()

//發出去

}, false);

本地的單元

var

callbacks : {}

window.addeventlistener("message", function(e)

function

點杯可樂(callback))

}function

吃肯德基的方法()

//喝可樂就是callback對吧

function

喝可樂()

很顯然,吃肯德基就是業務,那麼業務順序就是如此的,如果突然跳到接收事件裡去吃漢堡,喝可樂,總是很詭異的。

通過,快取callback假裝callback被傳遞出去,然後被呼叫,其實,就達到了目的。

以上。

給數字加上註解

注釋 命名清晰 簡單,單獨的變數使用,例如 變數定義 int a 1 判斷 if a 1 這些情況下通常會利用巨集定義來代替這些幻數 魔數,例如 定義 define max 1 使用 a max if a max 陣列使用,例如 gui程式設計需要定義5個按鍵,class,pop,定義 button...

當給main加上synchronized

1。在乙個同步化的靜態方法執行之前,它會獲取與它的class 物件相關聯的乙個管程 monitor 鎖 jls 8.4.3.6 所以在上面的程式中,主線程會在建立第二個執行緒之前獲得與pingpong.class 相關聯的那個鎖。只要主線程 占有著這個鎖,第二個執行緒就不可能執行同步化的靜態方法。具...

給flash加上了版權

抽空看了下contextmenu類和contextmenuitem類,偶然又看見f8幫助裡居然有單例模式的介紹,仿照寫了乙個,就當練習 圖是偶隨便畫的 點這裡 顯示 隱藏 不會用類的看這裡 fla中標準應該這麼寫 cr.show private var cm contextmenu cm new c...