FLEX ExternalInterface.available检查如何失败但仍然不可用?

时间:2012-03-23 01:28:45

标签: javascript flash flex actionscript externalinterface

背景

我们有几个用 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

1 个答案:

答案 0 :(得分:1)

我认为@ wvxvw的评论是正确的。

在initialize()方法中,asyncObject变量很可能正在收集垃圾(当问题发生时)。因此,您根本看不到任何错误。

在类级别(不在initialize()函数内)声明asyncObject变量,这可能会解决问题:

var asyncObject:Object;

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

您还可能希望查看使用返回AsyncToken的HTTPService(或其他Flex服务类),如果您的代码同时发出许多请求,则可以更好地处理响应....