Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
反射在基于AJAX的应用程序中的重要性 Ajax与反射_Ajax_Reflection_Jquery - Fatal编程技术网

反射在基于AJAX的应用程序中的重要性 Ajax与反射

反射在基于AJAX的应用程序中的重要性 Ajax与反射,ajax,reflection,jquery,Ajax,Reflection,Jquery,我正在开发一个基于ajax的应用程序,想知道反射在这里扮演或可能扮演什么角色 也许最重要的是,我在问自己,这是否是一个很好的解决问题的方法 通过单个处理程序处理所有ajax响应 反映或解释数据或错误 根据分析委托进一步处理(例如,在何处注入html) 这是一个萌芽过程吗?我想到了什么利弊 附加澄清 我当前的实现(我对此不满意)如下所示 为用户操作注册EventHandler,这将导致ajax请求 对于每个请求: 确定新内容的目标容器 验证ajax响应 如果一切正常,则将结果传递给相应的渲

我正在开发一个基于ajax的应用程序,想知道反射在这里扮演或可能扮演什么角色

也许最重要的是,我在问自己,这是否是一个很好的解决问题的方法

  • 通过单个处理程序处理所有ajax响应
  • 反映或解释数据或错误
  • 根据分析委托进一步处理(例如,在何处注入html)
这是一个萌芽过程吗?我想到了什么利弊

附加澄清 我当前的实现(我对此不满意)如下所示

  • 为用户操作注册EventHandler,这将导致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);
             }
        }
    });
 }
问题: 如何简化这一点,尤其是冗余错误检查?从“响应有效吗?错误消息或数据是什么样子?”的意义上讲,反射是否可以作为一种合理的结构来处理这个问题?另外:实际ajax请求的“耦合”和确定$targetContainer是“正常”过程吗

非常感谢,

Robson

是的,我认为注册ajax处理程序trought one pipe是一种好方法,因为它更易于控制,您将拥有更少的冗余代码和更少的加载效果。如果我看一下您的代码注释,似乎响应并不像您预期的那样。我通常这样做是为了控制一组与服务器脚本对话的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);
            }
        };
然后,当使用此对象时,我会对我的所有不同操作组进行trought,并精确地传递哪个操作和参数。我使用来请求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保持干净,POST变量是“隐藏的”
  • 在您的情况下,因为您可能希望使用一个服务器脚本集中服务器操作,所以应该使用“json”作为数据类型,因为从响应中检索详细信息(例如错误)要容易得多。您必须区分当url不存在或访问被拒绝时触发的ajax错误,以及当服务器响应它无法响应此请求时触发的错误,并区分服务器脚本的正确响应,我的意思是脚本响应良好,但可能发生命令错误,例如“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);

作为第一步,您应该更改服务器端的错误处理,以针对错误情况生成非OK/200响应,例如抛出500。然后在客户端将其与其他错误一起作为实际错误处理,而不是通过成功回调


这样,您就可以使用jQuery的抽象来处理全局错误:

这里的“反射”指的是什么?你能试着澄清这一点,或者把你的问题放到另一个角度吗?到目前为止,不知道你在找什么。我已经补充了一些解释。我希望这能使我使用反射(在更广泛的定义中)的意图和想法更加清晰。我感谢任何建议、批评或评论。谢谢。这是一个很好的模式。您甚至可以扩展它并抛出不同的错误代码。或者,如果您想决定服务器端的硬错误恢复选项,请使用500返回自定义标题,例如X-myapp-redirect-to。谢谢Jörn。我们通过已经存在的头代码进行了一些“信息传输”,但不幸的是,我们失去了对它的跟踪。哎哟:/我很感激指出这一点的重要性!即使如此,您是否认为通过单个处理程序路由所有请求并从那里进行授权可能有意义,或者您是否有具有类似体系结构的项目,或者每个请求或多或少都是为自己而存在的?非常感谢,罗宾逊非常感谢你。一些非常有用的建议(旁注:我确实使用JSON作为数据类型,但在ajax设置中将其设置为默认值)。对于新内容和实际ajax调用,targetContainer的“耦合/绑定”如何。你知道该如何组织吗?是的,通常我会在我的请求中存储其他东西,如target或其他任何东西,request.data对象是将发布的数据。请注意,如果您为不同的事情多次启动ajax负载,可能会出现问题。如果是这样,最好在此处设置一个成功和错误函数,并在每次需要一个加载(而不是仅一个)时构建一个不同的请求对象,但将成功和错误函数引用到您设置的主要函数,以便保持集中。有关示例,请参见我的帖子编辑。