2012-03-23 54 views
1

背景:FLEX ExternalInterface.available如何檢查失敗但仍然不可用?

我們寫在FLEX和所呈現的單一HTML頁面內多個Flash對象。

我們正在使用javascript在對象之間進行通信並執行其他頁面相關操作。


執行流程爲:

creationComplete事件我們的目標,我們執行以下(僞ISH)的FLEX代碼的代碼:

if (ExternalInterface.available) { 
    ExternalInterface.addCallBack("initialize"); 
    ExternalInterface.callMethod("ready"); 
} else { 
    Alert.show("No External Interface Available!"); 
} 

哪執行以下代碼:javascript(psuedo-ish)code:

Object.prototype.ready = function(){ 
    //this is simplified. More happens but all we care about is the following 
    flexObject.initialize(); 
} 

執行該follwoing 撓曲(僞ISH)代碼:

public function initialize() { 
    var asyncObject:Object = remoteService.executeMethod(); 
    asyncObject.addResponder(function(object:Object){ 
     if (ExternalInterface.available) { 
      ExternalInterface.callMethod("responseMethod"); 
     } else { 
      Alert.show("ExternalInterface dissapeared!?"); 
     } 
    }); 
} 

哪個應該執行以下的javascript(僞ISH)代碼:

Object.prototype.responseMethod = function() { 
    alert("responded!"); 
} 

問題:

有時概述的最後一個javascript函數永遠不會被調用。當發生這種情況時,錯誤警報不會出現,最終的代碼只是未執行,但到此爲止的所有內容都已成功執行。

這發生約1/100 +次在Chrome/Firefox的 出現這種情況大約1/10倍,IE8 出現這種情況大約9/10的時間在IE7(充分披露 - 我們要用於測試這一目標的唯一機也慢得多)

由於問題是間歇性的,並且在較慢的瀏覽器/機器中變得更加明顯,我懷疑它是與時間有關的。

如果我停下第一柔性「intiailize」從本質上是發生了,直到我在UI中點擊一個按鈕,而不是自動調用「creationComplete」一切都始終有效。

我也許能夠通過引入在JavaScript中的「延遲」簡單地解決這個問題,但我真的不喜歡破解

+0

試着把你的電話放在try catch方法中,看看有什麼地方出錯 – Triode 2012-03-23 04:52:57

+0

I'現在想知道是否在調用遠程方法後添加響應者。 – Randyaa 2012-04-23 01:29:43

+0

這是一個很好的問題,我想很多人都在思考:)後來添加響應者似乎很奇怪。但它確實是正確的:你不能添加響應者直到你有一個令牌,並且通過進行服務調用來獲得令牌。 – 2012-04-23 01:52:13

回答

1

我認爲@ wvxvw的評論是正確的錢。

在你的initialize()方法中,asyncObject變量很可能被垃圾收集(當問題發生時)。因此你根本沒有看到任何錯誤。

聲明在類一級(未初始化()函數內)的asyncObject變量,這可能會解決這個問題:

var asyncObject:Object; 

public function initialize() 
{ 
    asyncObject = remoteService.executeMethod(); 
    .... 
} 

你也可能想看看使用的HTTPService(或其他彈性服務類),它返回一個AsyncToken,並給你更好的處理響應,如果你的代碼可以同時發出多個請求......

+0

這個解釋似乎很有意義,所以我們實現了一組異步對象,當響應回來時它們會自行清理。 (我的描述中的代碼過於簡單,在任何時候都可能有很多事情發生,所以我需要保留所有代碼的引用)。 由於我們的問題一直存在,所以很難知道是否保持對異步對象的引用有幫助。我已經提出了答案,但現在我不能'接受'它,因爲我無法證明問題不以某種方式存在。 – Randyaa 2012-04-05 18:44:28

+0

我不知道我們的解決方案的實施是不是很正確,或者如果這沒有真正解決問題,但問題今天浮出水面:( – Randyaa 2012-04-07 01:55:53

+0

什麼是'removeService'變量的類型在'上面的'initialize()'方法,它是否真的只返回一個'Object'?...只是好奇。可能有助於向asyncObject添加一個錯誤處理程序,以防服務調用失敗 – 2012-04-07 05:34:42

相關問題