FLEX ExternalInterface.available检查怎么会失败,但仍然不可用

How could the FLEX ExternalInterface.available check fail but still be unavailable?

本文关键字:available ExternalInterface 检查 怎么会 失败 FLEX      更新时间:2023-09-26

背景:

我们有几个用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,并在您的代码同时发出许多请求时为您提供更好的响应处理。。。。