ActionScript 3 - составить функцию динамически

Я ищу AS3 эквивалент следующего кода JavaScript:

var funcName = "foo();"
var fHandler = new Function("a",funcName  + "return a + 1"); 

fHandler // now equals a function like function(a){ foo(); return a + 1 }

Хорошо, это очень упрощенный пример

Более общая картина: у меня есть сервер, который работает с клиентом JavaScript. Каждый ответ, который дает этот сервер, является обратным вызовом функции JavaScript, предоставляя в качестве аргументов ответ сервера.

Как таковой, он не использует сложный строгий протокол JSON (с кавычками вокруг имен атрибутов, которые не требуют, чтобы такие кавычки были действительными Object-Literal, и так далее, за исключением нескольких незначительных различий, которые все еще будут действительными Object-Literal в AS3) и сервер уже реализует более 100 API.

Однако сейчас есть запрос на выпуск Air-клиента для мобильных устройств.

Если бы я мог просто сделать следующее - было бы здорово. Это действительный скрипт EMCA, но не подходит для AS3

public function responseFromServer(String:s){
    s = chopCallbackWrap(s); //strips the 'myCallback(' and ')' parts
    //s is now always a string describing a valid Object-Literals not necessarily JSON
    return new Function("", " return " + s ) ();
}

Другим аспектом является обработка в общих клиентских алгоритмах, распространяемых на лету с сервера.

Как это сделать в AS3?

2 ответа

Решение

Я вижу два решения:

Во-первых, создайте новый SWF-файл во время выполнения со скриптом, который вам нужен, и загрузите его в Loader.loadBytes(),

Я рекомендую вам проверить эту библиотеку as3abc, as3swf и as3commons. У меня нет опыта работы с ними, но все они могут создавать и публиковать SWF во время выполнения (может быть, некоторые из них не поддерживают сценарии в опубликованном SWF, так что это задача для экспериментов).

И второе, чтобы выполнить ваш JS через ExternalInterface и использовать результат в as3.

UPD: еще одна библиотека AS2 eval аналог для AS3 - D.eval.

Это невозможно в AS3 (или 2), поскольку в среду выполнения не встроен компилятор сценариев (что означает отсутствие динамической интерпретации кода AS3 из программы AS3). Также нет функции eval (или, скорее, она не делает то, что делает javascript eval).

Вам, вероятно, придется создать другой API для флэш-версии или каким-либо образом подключить внешний движок JavaScript.

Другие вопросы по тегам