Значение отражения в приложениях на основе AJAX - PullRequest
5 голосов
/ 12 августа 2011

Ajax и Reflection

Я занимаюсь разработкой приложения на основе ajax и спрашиваю себя, какую роль играет или может сыграть рефлексия?

Вероятно, самое важное, я спрашиваю себя, будет ли это правильным подходом к

  • обработке всех ответов ajax с помощью одного обработчика,
  • отражает или интерпретируетданные или ошибка
  • делегируют дальнейшую обработку (например, куда вводить html) на основе анализа.

Это многообещающая процедура?Какие плюсы и минусы приходят на ум?

Дополнительные разъяснения

Моя текущая реализация, которой я не доволен, выглядит следующим образом.

  • Регистрация обработчиков событий для пользователядействие, которое приводит к ajax-запросам.
  • Для каждого запроса:
    • Определить, какой контейнер является целью для нового содержимого
    • Проверить ответ ajax
    • Передать результат в соответствующую функцию рендерингаесли все как положено

Вот пример

function setGamedayScoringChangeHandlers() {
    $("#community").delegate("div.community div.nav", "click", function() {
        var orderId = $(this).html();
        var communityId = $(this).closest('.communityView ').dashId();
        requestGamedayScoringByOrderId(communityId, orderId);
    });
}

function requestGamedayScoringByOrderId(communityId, orderId) {
    var $targetContainer = $('#community-' + communityId + '-gameday');
    $.ajax({
        url: '?api=league&func=getGamedayScoringByCommunityIdAndOrderId',
        data: {
            communityId : communityId,
            orderId : orderId
        },
        success: function(result) {

             // custom indicator, that sth. didn't work as supposed 
             if (result.success === false) {

                 // a php error couldn't be handled as expected
                 if (result.error === 'phpRuntimeError') {
                      // ..
                 }

             // ..

             }

             else {
                 renderGamedayScoring(result, $targetContainer);
             }
        }
    });
 }

Вопрос

Как это может быть, а особенно избыточная проверка ошибокупрощена?Может ли Reflection в некотором смысле: «Действителен ли ответ? И что говорит сообщение об ошибке или как выглядят данные?»быть разумной структурой справиться с этим?Дополнительно: Является ли «связывание» фактического запроса ajax и определение $ targetContainer «нормальной» процедурой?

Большое спасибо,
Робсон

Ответы [ 2 ]

3 голосов
/ 16 августа 2011

В качестве первого шага вы должны изменить обработку ошибок на стороне сервера, чтобы получить ответ не OK / 200 для случаев ошибок, например, бросьте 500. Затем обработайте это как фактическую ошибку на стороне клиента, наряду с другими ошибками, вместо того, чтобы передавать ее через success-callback.

Таким образом, вы можете использовать абстракции jQuery для глобальной обработки ошибок: http://api.jquery.com/ajaxError

3 голосов
/ 15 августа 2011

Да, я думаю, что зарегистрировать обработчик ajax для одного канала - это хороший способ, потому что им легче управлять, у вас будет меньше избыточного кода и меньше эффектов загрузки. Если я смотрю на ваши комментарии к коду, кажется, что ответ не такой, как вы ожидаете. Я использую это для управления группой запросов AJAX, используя серверный скрипт. Я строю один объект запроса, как:

    // myscript.js
var rqPHP = {
            url:'php/dispatcher.php', type:'POST', dataType:'json',
            success:function(json, status, jXHR){
                //console.log('rqPHP.succes : ', json);
                if(!json)   return console.warn('[rqPHP.success] json is null');
                if(!json.cmd)   return console.warn('[rqPHP.success] json.cmd is null');
                if(!json.res)   return console.warn('[rqPHP.success] json.res is null');
                if(json.err && json.err.length){        console.warn('[rqPHP.success errors cmd:'+json.cmd+'] '+json.err);}
                // so if no errors, dispatch actions based on original command asked
                switch(json.cmd){
                    case 'loadfile' :
                        // do whatever with response
                        break;
                    case 'savefile' :
                        // do whatever with response
                        break;
                }
            },
            error:function(jXHR, status, err){
                console.warn('[rqPHP.error] ', status,',',err,',',jXHR.responseText);
            }
        };

тогда, когда использование этого объекта затрагивает всю мою группу различных действий, я точно указываю, какое действие и аргументы я передаю. Я использую запрос данных JSON, чтобы получить простой ответ на анализ, чтобы я мог вернуть исходную запрашиваемую команду и некоторые подробности об ошибках, которые могут произойти, например, и когда мне нужно выполнить запрос:

// myscript.js
rqPHP.data = {'cmd':'loadfile', 'filename':'file.dat', 'arg2':'other argument'};
$.ajax(rqPHP);

Тогда пример одного серверного скрипта, который ответит:

// dispatcher.php    
    $pv = $_POST;
    $res = '';
    $err = array();
    // you check the command asked for :
    switch(strtolower($pv['cmd'])){
      case 'savefile' :
        // do whatever
        break;
      case 'loadfile' :
        // do whatever
        if(any error){
          $err[] = $loadError;// push error with whatever details you'll retrieve in javascript
       }else{
         $res = ',"res":"'.$dataLoaded.'"';// format json response so you'll check the var exist
        }
        break;
    }
    $jsonRes = '{"cmd":"'.$pv['cmd'].'"'.$res.',"err":"'.implode('|', $err).'"}';// json result
    print $jsonRes;

Это могут быть некоторые ошибки, это только для принципа, я надеюсь, что это поможет, только несколько последних советов:

  • вам лучше использовать requestObject.data для передачи любых аргументов, а не устанавливать URL, как вы это сделали, это гораздо проще, потому что jQuery правильно выполняет кодирование
  • вы можете использовать POST, чтобы URL оставался чистым, а почтовые переменные скрыты
  • в вашем случае, поскольку вы можете захотеть централизовать действия сервера с помощью ОДНОГО серверного скрипта, вы должны использовать 'json' в качестве dataType, потому что гораздо проще получать подробности из ответа, например, таких ошибок. Вы должны различать ошибку ajax, которая возникает, когда URL-адрес не существует, или доступ запрещен, хорошо, когда сервер отвечает, что он просто не может ответить на этот запрос, и различать правильный ответ вашего серверного скрипта, я имею в виду Сценарий отвечает хорошо, но может произойти ошибка команды, например, для команды «loadfile», аргумент fileUrl может быть неправильным или нечитаемым, поэтому действие выполнено, но ответ не будет действительным для вас ...

Если вы планируете запускать много загрузок для разных частей (я имею в виду, что вы можете не ждать ответа для ajax перед загрузкой нового), лучше установить основные функции успеха и ошибок для сохранения централизации, а затем собрать один новый объект запроса каждый раз, когда вы делаете загрузку

function rqSuccess(json, status, jXHR){
   // put same checking code as before, then you can also retrieve some particular variables
   // here, 'this' should correspond to the request object used for the $.ajax so :
   console.log('myTarget is : ', this.myTarget, ' , myVariable is : ', this.myVariable);
}
function rqError(jXHR, status, err){
   // put same checking code 
}
// then each time you want make one or many independant calls, build a new request object
var myRq = {url:'dispatcher.php',type:'POST',dataType:'json',
    success:rqSuccess,
    error:rqError,
    myTarget:$('#myblock'),// any variable you want to retrieve in response functions
    myVariable:'Hello !',// after all it is an object, you can store anything you may need, just be carefull of reserved variables of the ajax object (see jQuery $.ajax doc)
    // the data object is sanitized and sended to your server script, so put only variables it will need
    data : {'cmd':'loadfile',...}
}
$.ajax(myRq);
// you may load an other independant one without waiting for the response of the first
var myRq2 = {...myTarget:$('#anotherblock'), data:{'cmd':'anotheraction'}...}
$.ajax(myRq2);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...