• ajax请求先发后至问题处理


    js进行ajax请求时,会出现先发起的ajax请求,结果比后发起的后到的情况,比如刷新页面时用代码切换下拉控件时,本来想显示切换后的请求数据,结果刚刷新时的请求数据后到,就会出现问题

    大概有几种解决方式


    1、加一个类似序列号的东西,服务器收到这个序列号再返回,这样小于当前序列号的数据都抛掉

    2、使用同步模式

    3、终止当前ajax请求

    4、不太好的一种解决方法,使用SetTimeOut。

    前三种需要更改代码比较多,

    1、第4种相对简单一点,但不可靠,

    2、使用第2种方式有性能问题

    3、在不改动后台返回数据的情况下,使用第1种解决方式例子

    //本代码是为了处理返回的json 数据没有顺序导致被先发数据后到覆盖后发先到问题
    var hsfetchdata = {
        title: '未命名',
        islist: true,
        pkid: -1,
        url: "",
        pageindex: 1,
        pagesize: 10,
        searchfilter: "",
        pkfieldname: "",
        fieldname: "",
        fieldlabelname: "",
        rowtemplte: "",
        myScroll: null,
        isloadover: false,
        currentpkid: -1,
        kheight: 85,
        loginurl: "",
        filldatatype: 1,
        isextscroll: false,
        isover: false,
        isloading: false,
        fetchindex: 0,
        commoncallback: function (p_datas, savedatacallbck) {
            var datas = p_datas;
            var that = this;
            $.showLoading();
            $.ajax(
                {
                    url: that.url,
                    type: "POST",
                    data: datas,
                    contentType: "text/plain; charset=utf-8",
                    dataType: "json",
                    success: function (data) {
                        data.fetchindex = that.fetchindex;
                        try { $.hideLoading(); } catch (e) { }
                        if (data.length <= 0) {
                            $.toast("获取数据失败!", "cancel");
                        }
                        if (data[0].message == "nologin") {
                            window.location.href = that.loginurl;
                            return;
                        }
                        if (savedatacallbck != null && savedatacallbck != undefined) {
                            savedatacallbck(that.fetchindex, data[0]);
                            return;
                        }
                        if (data[0].result == "fail") {
                            $.toast(data[0].message, "cancel");
                        }
                    },
                    fail: function (error) {
                        try { $.hideLoading(); } catch (e) { }
                    }
                });
        }
    }

     处理方式:定义 

    var fetcher = Object.create(hsfetchdata);
    allfectchindex++;总发送次数
    fetcher.fetchindex = allfectchindex;
    //此处省略若干行代码
    fetcher.commoncallback(datas, getdatacallback);
    在回调函数里判断fetchindex是否大于allfectchindex,当小于时不处理,即可解决先发后至问题。
  • 相关阅读:
    php mysql与mysqli 区别
    让IT工作者过度劳累的12个坏习惯
    HR不懂爱,他的问题答不上来
    励志小故事
    php中如何把一个数字字符串作为一个变量
    新手应该具备的基本素质
    邮件中的缩写
    强大的网页性能测试工具Speed Tracer
    Windows环境下EditPlus运行Perl程序
    ActionScript3检测当前下载资源的速度
  • 原文地址:https://www.cnblogs.com/zhaogaojian/p/12439286.html
Copyright © 2020-2023  润新知