Flex Async Madness - Есть ли способ дождаться ответа rpc.Responder, прежде чем перейти к следующему утверждению? - PullRequest
0 голосов
/ 23 сентября 2011

Я чувствую, что, должно быть, я поступаю неправильно.У меня есть функция, которая должна создавать запрос на основе описания API доступных полей.Вот что у меня есть:

var query_fields = getQueryFieldsFor(sobject_name);
// Need query fields for the next statement, which actually does the query

public function getQueryFieldsFor(sObject:String):String{
    //helper function to get queryfields for given sobject
    var queryFields:String = '';

    app.connection.describeSObject(sObject,
        new mx.rpc.Responder(
            function(result:DescribeSObjectResult):void{
                var returnFields:String = '';
                for ( var field:Field in result.fields ){
                    if(field.active){
                        returnFields.concat(field.name+',')
                    }
                }
             returnFields.slice(0, returnFields.length-1); //remove last comma
             queryFields = returnFields;
        }, function(error):void{
            Alert.show('error in getQueryFieldsFor function');
        })
     );

     return queryFields;
}

Я знаю, что это не работает, и я думаю, что понимаю почему.Тем не менее, я продолжаю сталкиваться с этим типом проблемы, и я думаю, что я просто думаю об этом / проектирую это неправильно.Так что здесь лучше?Был бы очень признателен за понимание этого.Большое спасибо заранее.

1 Ответ

3 голосов
/ 23 сентября 2011

Было бы лучше вывести внешние функции и выполнить следующую строку кода после факта:

public function getQueryFieldsFor(sObject:String):String
{
    var responder:Responder = new Responder( onResult, onFault);
    app.connection.describeSObject(sObject, responder);
}

private function onResult(result:DescribeSObjectResult):void
{
        var returnFields:String = '';
        for ( var field:Field in result.fields ){
            if(field.active){
                returnFields.concat(field.name+',')
            }
        }
     returnFields.slice(0, returnFields.length-1); //remove last comma
     queryFields = returnFields;
}

Хотя ваша главная проблема не в коде, а в отсутствии асинхронного мышления.Вы не можете иметь функцию с именем "getQueryFields", которая будет возвращать ее немедленно.То, что вы хотите сделать, это думать в форме запроса / ответа.Вы пытаетесь получить некоторые данные, к службе делается запрос, возвращает данные, обновляет свойство, которое затем связывается с представлением, которое перерисовывается.Это правильный способ сделать любое веб-приложение.

Для вас также может быть полезно взглянуть на каркасы приложений, такие как RobotLegs и Parsley , поскольку они помогают вам управлять этими приложениями.ситуации.У Parsley также есть библиотека задач, которая позволяет вам выполнять несколько асинхронных задач одну за другой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...