#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. Ах, это интересно (идентификатор объекта). Не знал, что это доступно. Спасибо за совет!