• 关于jquery的$.ajax发接口的同步与异步问题


    1.在使用$.ajax发接口时想对返回数据做一些处理后拿到其他方法中使用

      发请求函数如下:

    function getProjectName(projectId){
            project.projectName = [];
            $.ajax({
                type: conf.GET,
                url: conf.API_qryProjectList+"?projectId="+projectId,
                dataType: "JSON"
            }).done(function(data) 
                console.log("执行getprijectName的done");
            });
        }

      使用时代码如下:

    function qryTaskInfo(projectId) {
            $.ajax({
                type: conf.GET,
                url: conf.API_qryTaskList+"?myTaskFlag="+projectId+"&userId="+conf.userId,
                dataType: "JSON"
            }).done(function(data) {
                project.taskList = data.taskList;
                
                var taskList = project.taskList;
                var projectArrays = [];
                var projectIdArrays = [];
                for(var i = 0; i < taskList.length; i++) {
                    projectId = taskList[i].projectId;
                    if (!isContainProjectId(projectIdArrays, projectId)) {
                        var projectObject = {"projectId": projectId + ""};
                        projectIdArrays.push(projectObject);
                        console.log("调用getProjectName");
                        getProjectName(projectId);
                        console.log("调用getUserByProjectId");
                        getUserByProjectId(projectId);
                        console.log(project.projectName);
                        console.log(project.projectUsers);
                        console.log("-----------");
                        var pName = {"projectName": project.projectName+""};
                        var pUsers = {"projectUsers": project.projectUsers+""};
                        projectIdArrays.push(pName);
                        projectIdArrays.push(pUsers);
                        console.log(pName);
                        console.log(pUsers);
                    }
                }
                console.log("huhx projectids: " + projectIdArrays);
                var hasFinish = 0, hasComplete = 0, total = 0,projectName,users;
                for(var i = 0; i < projectIdArrays.length; i++) {
                    for(var j = 0; j < taskList.length; j++) {
                        if (projectIdArrays[i].projectId == taskList[j].projectId) {
                            total ++;
                            if (taskList[j].status == "1") {
                                hasFinish++;
                            } else if (taskList[j].status == "3") {
                                hasComplete++;
                            }
                            projectIdArrays[i].hasFinish = hasFinish;
                            projectIdArrays[i].hasComplete = hasComplete;
                            projectIdArrays[i].total = total;
                        }
                    }
                    projectArrays.push(projectIdArrays[i]);
                }
                console.log("huhx arrays: " + projectArrays);
                projectList=projectArrays;
                //console.log(data);
            });
        }

      执行结果:

      问题:

        在接口已发送和接口返回数据这段时间内执行了其他js代码,导致我在done中做的处理都没及时生效。

      解决方法:

        在请求参数中添加async:false,设置为同步发送请求。

     添加之后控制台:

  • 相关阅读:
    截取最后一个下划线前面的字符串
    jqgrid加载本地数据功能
    Android、Ios手机端字体根据屏幕分辨率自适应的方法,使用rem和px的区别
    js获取8个月前时间,1天前时间
    手机端/pc端 弹出后,禁止底部页面滚动方法
    列表左右滚动
    jQuery点击隐藏点击显示,计算高度,位置,给当前加上焦点,其他去掉焦点
    工厂模式浅析
    教你看懂UML类图
    Rpc基础篇
  • 原文地址:https://www.cnblogs.com/liululin/p/5908623.html
Copyright © 2020-2023  润新知