JQuery Ajax冗余消除:通用函数的多成功回调实现问询
封装通用Ajax请求消除冗余代码
我完全懂你想简化这段代码的想法——四个Ajax请求除了目标URL、响应处理逻辑和要更新的Captivate变量不同,其余配置(比如cache: false、错误处理的核心逻辑)几乎一模一样,确实有很大的优化空间。下面是具体的解决方案:
第一步:抽离通用Ajax请求函数
我们把重复的Ajax配置和错误处理逻辑单独封装成函数,只把变化的部分作为参数传入:
- 请求的URL路径(比如
/pub/getgender.php) - 学习者ID(
lid) - 处理成功响应的自定义回调函数
- 对应的Captivate变量名(用于统一错误处理)
function fetchLearnerData(urlPath, lid, successCallback, captivateVarName) { $.ajax({ url: urlPath + "?q=" + lid, cache: false, success: function(response) { // 调用自定义的成功回调,传递响应结果 successCallback(response); }, error: function(jqXHR, textStatus, errorThrown) { // 统一的错误处理逻辑 const errorValue = 'DATA ERROR'; console.log(errorValue); cpAPIInterface.setVariableValue(captivateVarName, errorValue); } }); }
第二步:改造原getLearner函数
现在用这个通用函数替换原来的四个独立Ajax请求,每个请求的特有响应逻辑写成单独的回调函数即可:
function getLearner(){ // 初始化用于存储收集到的信息的变量 var lid = ''; var sName = ''; var oName = ''; var oGender = ''; var oCourse = ''; var oAccess = ''; var oLevel = ''; // 从LMS获取学生ID并存入JS变量lid if (typeof window.GetStudentID === 'undefined'){ lid='DATA ERROR'; console.log('ID: '+ lid); } else { lid = window.GetStudentID(); //lid='174186' // 测试学习者ID cpAPIInterface.setVariableValue('bcID',lid); // 将学习者ID存入Captivate console.log('ID: '+ lid); if(lid == ''){ lid='ID Not Found'; console.log('ID: '+ lid); } } // 从LMS获取学生姓名并存入JS变量oName和sName if (typeof window.GetStudentName==='undefined'){ oName='DATA ERROR'; console.log('Full Name: '+ oName); } else { oName = window.GetStudentName(); if(oName == ''){ oName='Name Not Found'; console.log('Full Name: '+ oName); } else { sName = oName.split(', ')[1]; oName = oName.split(', ')[1] + ' ' + oName.split(', ')[0]; cpAPIInterface.setVariableValue('bcNameShort',sName); // 将名存入Captivate cpAPIInterface.setVariableValue('bcNameFull',oName); // 将全名存入Captivate console.log('Full Name: '+ oName); console.log('Short Name: '+ sName); } } // 获取性别 fetchLearnerData("/pub/getgender.php", lid, function(response) { oGender = response || 'No Gender Found'; console.log('Gender: ' + oGender); cpAPIInterface.setVariableValue('bcGender', oGender); }, 'bcGender'); // 获取课程 fetchLearnerData("/pub/ga.php", lid, function(response) { if(response === ''){ oCourse = 'No Course Found'; } else { const teststring = response.replace(/^\s+|\s+$/g,''); oCourse = teststring.split(" ")[0]; } cpAPIInterface.setVariableValue('bcCourse', oCourse); console.log('Course: '+oCourse); }, 'bcCourse'); // 获取无障碍需求 fetchLearnerData("/pub/getdisability.php", lid, function(response) { oAccess = response === '' ? 'No' : 'Yes'; cpAPIInterface.setVariableValue('bcAccess', oAccess); console.log('Accessibility: '+oAccess); }, 'bcAccess'); // 获取等级 fetchLearnerData("/pub/getlevel.php", lid, function(response) { oLevel = response || 'No Level Found'; cpAPIInterface.setVariableValue('bcLevel', oLevel); console.log('Level: '+oLevel); }, 'bcLevel'); }
优化后的优势:
- 消除了重复的Ajax配置代码,后续如果要修改全局Ajax规则(比如添加超时设置),只需改动
fetchLearnerData一个函数 - 每个请求的特有逻辑被封装成独立回调,代码结构更清晰,便于维护和修改
- 错误处理逻辑统一,避免了重复编写相同的错误处理代码
内容的提问来源于stack exchange,提问作者Jon Hart
相关产品推荐
相关产品推荐

