Как вы динамически вызываете функцию в ActionScript 3 из Javascript во время выполнения без использования eval ()? - PullRequest
3 голосов
/ 11 ноября 2011

Я пытаюсь создать API в JS, который будет выполнять некоторые операции и затем выполнять обратный вызов, который зарегистрирован в AS, когда это будет сделано. Поскольку это API, я просто предоставляю сигнатуру метода JS для вызова другим разработчиком во Flash. Таким образом, имя обратного вызова, которое зарегистрировано в части кода AS, должно быть параметром, который передается в API JS, чтобы JS мог связаться с Flash.

Например:

[код AS3]

ExternalInterface.addCallback("flashCallbackName", processRequest);
ExternalInterface.call("namespace.jsFnToCall", flashCallbackName);

function processRequest(data:String):void
{
    //do stuff
}

[код JS]

var namespace =
{
    jsFnToCall: function(callback)
    {
        //Do stuff in this function and then fire the callback when done.

        //getFlashMovie is just a util function that grabs the
        //Flash element via the DOM; assume "flash_id"'s a global var
        //Below does not work...it's what I'd be ideally be doing some how.
        getFlashMovie(flash_id).callback(data);
    }
};

Поскольку определение функции в AS, я не могу использовать подход окна [имя функции]. Единственный способ, о котором я могу думать, - это создать обратный вызов в строке, а затем использовать eval () для его выполнения.

Предложения? T.I.A.

Ответы [ 2 ]

1 голос
/ 11 ноября 2011

Ну, я могу вспомнить одну вещь, которую я бы попробовал, и одну, которая бы работала.

То, что я попробовал бы в первую очередь.

getFlashMovie(flash_id)['callback'](data);

Что бы работало: есть обратный вызоввсегда будь таким же, скажем callback.Первый параметр для обратного вызова может быть использован для определения того, какую фактическую функцию вызывать во флэш-памяти.Например:

function callback($fn:String, $data:*) {

    // either
    this[$fn]($data);
    // or
    switch ($fn) {
        case "callback1":
            DoSomeCallback($data);
            break;
}
0 голосов
/ 13 ноября 2011

Кроме того, передача objectID делает его немного проще:

ExternalInterface.addCallback("flashCallbackName", processRequest);
ExternalInterface.call("namespace.jsFnToCall", ExternalInterface.objectID, "flashCallbackName");

Тогда в вашем JS:

var namespace =
{
  jsFnToCall: function(objectID, callback)
  {
    //Do stuff in this function and then fire the callback when done.

    document[objectID][callback](data);
  }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...