【发布时间】:2012-03-23 01:28:44
【问题描述】:
背景:
我们有几个用 FLEX 编写并在单个 HTML 页面中呈现的 Flash 对象。
我们正在使用 javascript 在对象之间进行通信并执行其他与页面相关的操作。
执行流程:
在我们对象的 FLEX 代码的 creationComplete 事件中,我们执行以下(伪)代码:
if (ExternalInterface.available) {
ExternalInterface.addCallBack("initialize");
ExternalInterface.callMethod("ready");
} else {
Alert.show("No External Interface Available!");
}
执行以下 javascript(伪类)代码:
Object.prototype.ready = function(){
//this is simplified. More happens but all we care about is the following
flexObject.initialize();
}
执行以下 flex(伪类)代码:
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(伪类)代码:
Object.prototype.responseMethod = function() {
alert("responded!");
}
问题:
有时最后列出的 javascript 函数永远不会被调用。当这种情况发生时,error 警告都不会出现,最终代码只是没有执行,但到目前为止的所有内容都已成功执行。
这种情况在 Chrome/Firefox 中发生大约 1/100 次以上 这在 IE8 中发生了大约 1/10 次 这种情况在 IE7 中发生了大约 9/10 次(完全披露 - 我们必须用于测试的唯一机器也慢得多)
由于问题是间歇性的,并且在较慢的浏览器/机器中变得更加明显,我怀疑它与时间有关。
如果我停止发生第一个 flex 'intiailize' 调用,直到我点击 UI 中的一个按钮,而不是自动点击本质上是 'creationComplete' 的按钮,一切总是有效的。
我可以通过在 javascript 中引入“延迟”来解决问题,但我真的不喜欢这样 hack强>.
【问题讨论】:
-
试着把你的电话放在 try catch 方法中,看看有什么问题
-
我现在想知道这是否与调用远程方法后添加响应者有关。
-
这是一个很好的问题,我想很多人都已经思考过了 :) 之后添加响应者似乎很奇怪。但这实际上是正确的:在获得令牌之前,您无法添加响应者,并且您可以通过调用服务来获取令牌。
-
虽然服务调用是异步的,但是否有可能在服务调用过程中抛出异常,导致响应者从未添加?
标签: javascript flash apache-flex actionscript externalinterface