Как проверка FLEX ExternalInterface.available может быть неудачной, но все же недоступной? - PullRequest
1 голос
/ 23 марта 2012

Справочная информация:

У нас есть несколько 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, но мне действительно очень не нравится хак .

1 Ответ

1 голос
/ 30 марта 2012

Я думаю, что комментарий @ wvxvw прав на деньги.

В вашем методе initialize () очень вероятно, что переменная asyncObject получает сборщик мусора (когда возникает проблема). Таким образом, вы не видите никаких ошибок.

Объявите переменную asyncObject на уровне класса (не внутри функции initialize ()), и это, вероятно, решит проблему:

var asyncObject:Object;

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

Вы также можете захотеть использовать HTTPService (или другие классы Flex-сервисов), который возвращает AsyncToken и обеспечивает лучшую обработку ответов, если ваш код выполняет много одновременных запросов ....

...