在开发tphelper项目的时候,遇到一个这样的问题,因为接口请求失败次数过多,要求接口请求5次都失败才弹窗提示用户失败,否则再次发起请求即可。因为用的是c语言写的接口,调试起来特别麻烦,最后选择的调试方法是,在本地安装测试包,要求后台开发同事做成前端代码自动更新,这样就只需要我一个测试,而不需要浪费更多的人力。下面写示例:
注意循环num++一定要写在异步函数执行完的回调函数里,不然num首先已经加到5了,异步函数都还没开始执行。
window.external.nativeCall('GetUserOptions', [],function (res) {
this.getNum++;
//res = "";todo
if(res.length > 0 && res != null && res != ""){
_this.loadDataSuccess = true;
_this.data.userOptions=JSON.parse(res);
for(var i in _this.data.userOptions){
if(_this.data.userOptions[i].is_filter){
if(_this.data.userOptions[i].uic_type === 2){
_this.ui.pbGameLi.eq(_this.data.userOptions[i].filter_id-1).addClass('checked');
}else{
_this.ui.pbFriendsLi.eq(_this.data.userOptions[i].filter_id-1).addClass('checked');
}
}
}
$('.filteredNum').html(_this.data.filteredNum);
closeDialog();
}else{
if(_this.getNum === 5 || (new Date().getTime()-_this.nowTime) > 5000) {
closeDialog();
TGDialogS('#tc_getdata_error');
_this.statistics();
}else{
_this.external();
}
}
})
一个更加显浅异步函数就是setTimeout()
假如for循环向下面这么写,一下子就能看懂,为啥普通的for循环无法实现我们想要的异步函数循环
for(var i=0;i<5;i++){
console.log(i)
setTimeout(function(){
if(parseInt(Math.random()*10)+1 === 2){
return;
}
},1000)
}
image.png
接下来是正确的写法:
var num = 0;
function test () {
setTimeout(function(){
num++;
var num1 = parseInt(Math.random()*10)+1;
console.log(num1);
if( num1 === 2){
return true;
}else{
test();//递归
}
},1000)
}
test();
递归.png
网友评论