Ajax 和反射
我正在开发一个基于 ajax 的应用程序,想知道反射在这里扮演或可能扮演什么角色?
也许最重要的是,我问自己,这是否是一个好的方法
- 通过单个处理程序处理所有 Ajax 响应,
- 反射(reflect)或解释数据或错误
- 根据分析委托(delegate)进一步处理(例如在何处注入(inject) 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 是一个“正常”过程吗?
非常感谢,
罗布森
最佳答案
是的,我认为通过一个管道注册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,以便网址保持干净,帖子变量“隐藏”
- 在您的情况下,因为您可能希望使用一个服务器脚本集中服务器操作,所以您应该使用“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);
关于ajax - 反射在基于 AJAX 的应用程序中的意义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7045050/