Actionscript ожидает асинхронного события внутри функции - PullRequest
1 голос
/ 17 ноября 2009

Мне нужна небольшая помощь с асинхронными событиями в ActionScript 3. Я пишу простой класс, который имеет две функции, каждая из которых возвращает строки (логика и код описаны ниже). Из-за асинхронной природы службы HTTPService AS3 строка возвращаемого значения всегда достигается до того, как из службы возвращается результат, в результате чего получается пустая строка. Возможно ли включить в эту функцию какой-либо тип логики или оператора, который заставит ее ждать ответа, прежде чем возвращать значение? Есть ли фреймворк, который обрабатывает такие вещи?

  1. Позвоните в службу
  2. Результат анализа JSON, выделение значения интереса
  3. Возвращаемое значение

    public function geocodeLocation(address:String):Point
    {
        //call Google Maps API Geocode service directly over HTTP
        var httpService:HTTPService = new HTTPService;
        httpService.useProxy = false;
        httpService.url = //"URL WILL GO HERE";
        httpService.method = HTTPRequestMessage.GET_METHOD;
        var asyncToken : AsyncToken = httpService.send();
        asyncToken.addResponder( new AsyncResponder( onResult, onFault));
    
        function onResult( e : ResultEvent, token : Object = null ) : void
        {
            //parse JSON and get value, logic not implemented yet
            var jsonValue:String=""
        }
    
        function onFault( info : Object, token : Object = null ) : void
        {
            Alert.show(info.toString());
        }
    
        return jsonValue; //line reached before onResult fires
    }
    

1 Ответ

2 голосов
/ 22 ноября 2009

Вы должны определить onResult и onFault в своем приложении - где бы вы ни вызывали geocodeLocation - и затем передать их в вашу функцию в качестве аргументов после адреса. Ваша onResult функция будет получать данные, анализировать точку и что-то с ней делать. Ваша функция geocodeLocation ничего не вернет.

public function geocodeLocation(address:String, onResult:Function, onFault:Function):void
{
    //call Google Maps API Geocode service directly over HTTP
    var httpService:HTTPService = new HTTPService;
    httpService.useProxy = false;
    httpService.url = //"URL WILL GO HERE";
    httpService.method = HTTPRequestMessage.GET_METHOD;
    var asyncToken : AsyncToken = httpService.send();
    asyncToken.addResponder( new AsyncResponder( onResult, onFault));
}

А потом в вашем приложении где-то:

function onResult( e : ResultEvent, token : Object = null ) : void
{
    var jsonValue:String=""
    //parse JSON and get value, logic not implemented yet
    var point:Point = new Point();
    //do something with point
}

function onFault( info : Object, token : Object = null ) : void
{
    Alert.show(info.toString());
    //sad face
}

var address:String = "your address here";
geocodeLocation(address, onResult, onFault);

Когда веб-служба отвечает, управление переходит либо к вашей функции onResult, где вы будете анализировать Point и делать с ней что-то полезное, либо к вашей функции onFault.

Кстати, у вас могут возникнуть проблемы с вызовом геокодера Google Maps, возможно, лучше использовать официальный SDK и воспользоваться их кодом: http://code.google.com/apis/maps/documentation/flash/services.html

...