背景
我们有几个用 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 'intiailize'调用发生,直到我点击UI中的按钮而不是自动执行基本上'creationComplete'的操作,一切都可以正常工作。
我可以通过在javascript中引入'延迟'来解决问题,但我真的不喜欢 hack
答案 0 :(得分:1)
我认为@ wvxvw的评论是正确的。
在initialize()方法中,asyncObject变量很可能正在收集垃圾(当问题发生时)。因此,您根本看不到任何错误。
在类级别(不在initialize()函数内)声明asyncObject变量,这可能会解决问题:
var asyncObject:Object;
public function initialize()
{
asyncObject = remoteService.executeMethod();
....
}
您还可能希望查看使用返回AsyncToken的HTTPService(或其他Flex服务类),如果您的代码同时发出许多请求,则可以更好地处理响应....