美文网首页
Javascript 异步函数的for循环

Javascript 异步函数的for循环

作者: 清汤饺子 | 来源:发表于2018-12-03 15:56 被阅读0次

    在开发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

    相关文章

      网友评论

          本文标题:Javascript 异步函数的for循环

          本文链接:https://www.haomeiwen.com/subject/huvycqtx.html