工作新得1:一定要在回调的成功或者失败里面写逻辑,已经遇到好几次了,工作中这个容易被别人抓到把柄(记忆中是两次被别人揪出来了,很没面子。),以为你是个低级程序员
亲身例子1
- 用户设置支付密码,需要2次md5加密密码,并且加密的方法是异步的。一定要在第一次加密成功的回调里面写第二次的加密代码,然后把第二次加密后的密码ajax请求保存到数据库中。
错误写法:虽然程序是顺序执行的。但由于由于加密是异步的,所以第二次加密和ajax请求可以视为同时执行的。基于这种情况,利用ajax访问add_paypassword
接口,导致访问该接口传的参数有可能为第一次加密的密码,也有可能为第二次加密的密码。
/**
设置支付密码
*/
function setPayPwd(paySurePassword){
signature.md5({
data: paySurePassword
}, function(ret, err) {
if (ret.status) {
console.log("原始一次加密为" + JSON.stringify(ret));
console.log("一次加密为" + JSON.stringify(ret.value) + "小写为" + ret.value.toLowerCase());
signature.md5({
data: "09ES27Ookep2RXA" + ret.value.toLowerCase()
}, function(ret1, err1) {
if (ret1.status) {
console.log("二次加密为" + JSON.stringify(ret1.value) + "小写为" + ret1.value.toLowerCase());
secret = ret1.value.toLowerCase();
} else {
alert(JSON.stringify(err));
}
});
/**
设置支付密码ajax请求,存储到数据库中
*/
var param = {
values: {
pay_pass: secret,
}
};
apiAjax("user/add_paypassword", "post", param, function() {}, function(ret) {
console.log(JSON.stringify(ret));
if(ret.code == 1){// 处理成功的逻辑
var user = $api.getStorage('user_info');
user.pay_pass = 1234;
//重新保存用户信息
$api.setStorage('user_info', user);
}else{// 处理失败的逻辑
}
api.toast({
msg: ret.msg,
duration: 2000,
location: 'middle'
});
api.closeWin();
});
} else {
alert(JSON.stringify(err1));
}
});
}
}
正确写法:第二次加密写在第一次加密成功的回调里。ajax请求写在第二次加密成功的回调里。
/**
设置支付密码
*/
function setPayPwd(paySurePassword){
console.log("paySurePassword为" + paySurePassword);
signature.md5({
data: paySurePassword
}, function(ret, err) {
if (ret.status) {
console.log("原始一次加密为" + JSON.stringify(ret));
console.log("一次加密为" + JSON.stringify(ret.value) + "小写为" + ret.value.toLowerCase());
signature.md5({
data: "09ES27Ookep2RXA" + ret.value.toLowerCase()
}, function(ret1, err1) {
if (ret1.status) {
// return ret.value;
console.log("二次加密为" + JSON.stringify(ret1.value) + "小写为" + ret1.value.toLowerCase());
secret = ret1.value.toLowerCase();
var param = {
values: {
pay_pass: secret,
}
};
apiAjax("user/add_paypassword", "post", param, function() {}, function(ret) {
console.log(JSON.stringify(ret));
if(ret.code == 1){// 处理成功的逻辑
// $api.setStorage('payPassword',secret);
var user = $api.getStorage('user_info')
user.pay_pass = 1234;
//重新保存用户信息
$api.setStorage('user_info', user);
}else{// 处理失败的逻辑
}
api.toast({
msg: ret.msg,
duration: 2000,
location: 'middle'
});
api.closeWin();
});
} else {
alert(JSON.stringify(err1));
}
});
} else {
// alert(JSON.stringify(err));
return JSON.stringify(err);
}
});
亲身例子2
- 当前用户坐标和公司后台返回的坐标,要计算这两个坐标是否对应的同一个市,如果是同一个市显示公交路线规划、汽车路线规划、陆行路线规划,否则只显示汽车路线规划。
错误写法:公司后台返回的坐标的的逆向地理编码 没有写在 当前位置的逆向地理编码的 里面。由于该方法是异步执行的,这样就有可能出现这种情况:当前位置的逆向地理编码还没有解析完成,而公司后台返回的坐标的的逆向地理编码解析完成了,会造成本该是同一个市的经纬度(latLngAddress 等于currentLatLngAddress),然则latLngAddress还没有被复制,会执行latLngAddress 不等于currentLatLngAddress的逻辑,从而只显示汽车路线规划
var geocoder = new AMap.Geocoder({city: '全国'});
geocoder.getAddress(currentLngLat, function(status, result) {// 逆向地理编码,获取当前用户坐标 对应的地址信息
if (status === 'complete' && result.info === 'OK') {
// result为对应的地理位置详细信息
latLngAddress = result.regeocode.addressComponent.city;
console.log("latLngAddress为" + latLngAddress);
}
});
geocoder.getAddress(latLng, function(status, result) {// 逆向地理编码,获取公司后台返回的坐标 对应的地址信息
if (status === 'complete' && result.info === 'OK') {
// result为对应的地理位置详细信息
currentLatLngAddress = result.regeocode.addressComponent.city;
console.log("currentLatLngAddress" + currentLatLngAddress);
if(latLngAddress == currentLatLngAddress){// 同一个市
// 显示公交路线规划、汽车路线规划、陆行路线规划
}else{
// 隐藏公交路线规划、陆行路线规划
$(".busClass").attr("style","display:none");
$(".walkClass").attr("style","display:none");
}
}
});
正确写法:公司后台返回的坐标的的逆向地理编码 写在了当前位置的逆向地理编码的 里面,从宏观上确保是顺序执行的。即:当前位置的逆向地理编码执行完毕才会执行公司后台返回的坐标的的逆向地理编码。然后再去判断latLngAddress 是否等于currentLatLngAddress是最准确的做法。
var geocoder = new AMap.Geocoder({city: '全国'});
geocoder.getAddress(currentLngLat, function(status, result) {// 逆向地理编码,获取当前用户坐标 对应的地址信息
if (status === 'complete' && result.info === 'OK') {
// result为对应的地理位置详细信息
latLngAddress = result.regeocode.addressComponent.city;
geocoder.getAddress(latLng, function(status, result) {// 逆向地理编码,获取公司后台返回的坐标 对应的地址信息
if (status === 'complete' && result.info === 'OK') {
// result为对应的地理位置详细信息
currentLatLngAddress = result.regeocode.addressComponent.city;
if(latLngAddress == currentLatLngAddress){// 同一个市
// 显示公交路线规划、汽车路线规划、陆行路线规划
}else{
// 隐藏公交路线规划、陆行路线规划
$(".busClass").attr("style","display:none");
$(".walkClass").attr("style","display:none");
}
}
});
}
});
执行结果:当前位置距离目的工作地点1396.3km,只显示汽车路线
工作新得2:更改完代码之后,将所有的测试弹框和log注释掉,保留代码的间接性。否则别人你是个毛手毛脚,粗心大意的程序员