Справочная информация:
У нас есть несколько flash-объектов, написанных на FLEX и визуализируемых внутри одной HTML страницы.
Мы используем javascript для связи между объектами и выполнения других операций, связанных со страницей.
Поток выполнения:
В событии creationComplete кода FLEX наших объектов мы выполняем следующий (псевдо-иш) код:
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 (псевдо-иш) код:
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 никогда не вызывается. Когда это происходит, ни одно из предупреждений error не появляется, окончательный код просто не выполняется, но все до этого момента успешно выполнено.
Это происходит примерно 1/100 + раз в Chrome / Firefox
Это происходит примерно в 1/10 раза в IE8
Это происходит примерно 9/10 раз в IE7 (полное раскрытие - единственная машина, которую мы должны использовать для тестирования, это также намного медленнее)
Поскольку проблема носит прерывистый характер и становится все более очевидной в более медленных браузерах / машинах, я подозреваю, что это связано со временем.
Если я остановлю первый вызов flex 'intiailize' до тех пор, пока я не нажму кнопку в пользовательском интерфейсе, а не автоматически на том, что по сути является "creationComplete", все работает ВСЕГДА.
Я могу решить проблему, просто введя «задержку» в javascript, но мне действительно очень не нравится хак .