FLEX ExternalInterface.available检查怎么会失败,但仍然不可用
How could the FLEX ExternalInterface.available check fail but still be unavailable?
背景:
我们有几个用FLEX编写的flash对象,并在一个HTML页面中呈现。
我们使用javascript在对象之间进行通信,并执行其他与页面相关的操作。
执行流程:
在对象的FLEX代码的creationComplete事件中,我们执行以下(伪ish)代码:
if (ExternalInterface.available) {
ExternalInterface.addCallBack("initialize");
ExternalInterface.callMethod("ready");
} else {
Alert.show("No External Interface Available!");
}
它执行以下javascript(psuedo-ish)代码:
Object.prototype.ready = function(){
//this is simplified. More happens but all we care about is the following
flexObject.initialize();
}
执行以下flex(psuedo-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(psuedo-ish)代码:
Object.prototype.responseMethod = function() {
alert("responded!");
}
问题:
有时概述的最后一个javascript函数永远不会被调用。当这种情况发生时,没有任何错误警报出现,最终代码没有执行,但到目前为止,所有内容都已成功执行。
这种情况在Chrome/Firefox中发生的次数约为1/100多次这种情况在IE8中大约发生1/10次这种情况在IE7中发生了大约9/10次(完全公开-我们必须使用的唯一机器也慢得多)
由于这个问题是间歇性的,并且在速度较慢的浏览器/机器中变得更加明显,我怀疑这与时间有关。
如果我停止第一个flex"初始化"调用,直到我点击UI中的按钮,而不是自动点击本质上的"creationComplete",一切都会正常工作。
我可以简单地通过在javascript中引入"延迟"来解决问题,但我真的非常不喜欢hack。
我认为@wvxvw的评论是对的。
在initialize()方法中,asyncObject变量很可能被垃圾收集(当问题发生时)。因此,您看不到任何错误。
在类级别声明asyncObject变量(不在initialize()函数内部),这可能会解决问题:
var asyncObject:Object;
public function initialize()
{
asyncObject = remoteService.executeMethod();
....
}
您可能还想考虑使用HTTPService(或其他灵活服务类),它返回AsyncToken,并在您的代码同时发出许多请求时为您提供更好的响应处理。。。。
- Is onfling available for html, html5
- GWT应用程序中出现错误HTTP 404(“Script Tag Failure-no status available
- FLEX ExternalInterface.available检查怎么会失败,但仍然不可用
- chrome.contextMenus is not available
- Angular.js: Error: Module 'MyApp' is not available
- JavaScript组件没有名为“available"”的方法.使用transformrequest时
- Firefox异常'JavaScript组件没有名为:"available"'的方法