Как динамически вызывать функцию в Actionscript 3 из Javascript во время выполнения без использования eval()?

#javascript #actionscript-3

#javascript #actionscript-3

Вопрос:

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

Например:

[Код AS3]

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

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

[JS code]

 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, я не могу использовать подход window [имя функции]. Единственный способ, который я могу придумать, — это создать обратный вызов в строке, а затем использовать eval() для его выполнения.

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

Ответ №1:

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

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

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

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

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

    // either
    this[$fn]($data);
    // or
    switch ($fn) {
        case "callback1":
            DoSomeCallback($data);
            break;
}
  

Комментарии:

1. Я попробую предложение № 1 и посмотрю, сработает ли оно. Спасибо. Что касается предложения № 2, я думал об этом, но я не хотел делать его настолько жестким с точки зрения структуры, и, я думаю, что это сложнее реализовать.

Ответ №2:

Кроме того, передача 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);
  }
};
  

Комментарии:

1. Ах, это интересно (идентификатор объекта). Не знал, что это доступно. Спасибо за совет!