jsonp封装

 

/*
1. 每个jsonp请求唯一,防止缓存,每个请求存储内容如下
    {
        callback: function(){},
        scriptNode: [domNode]
        timer: [定时器]
    }
2. src的参数需要编码
3. 请求超时,抛出错误
4. 使用说明,使用方式类似JQuey的ajax方式,例: jsonp({
      url:[string],
      data:[obj],
      callback:[function],
      fail: [function],
      timeout: [number]
})
*/

function jsonp(opts) {
    if (!opts || !opts.url) {
        return;
    }
    // 初始化参数
    var options = {
        url: opts.url,
        data: opts.data ? opts.data : null,
        callback: opts.callback ? opts.callback : null,
        fail: opts.fail ? opts.fail : null,
        timeout: opts.timeout ? opts.timeout : 3000
    }
    var helper = {
        joinURL: function(url, data) {
            if (!url || !data) {
                return;
            }
            for (var i in data) {
                if (data.hasOwnProperty(i)) {
                    if (url.indexOf("?") >= 0) {
                        url += "&";
                    } else {
                        url += "?";
                    }
                    url += i + "=" + data[i];
                }
            }
            return url;
        },
        encodeURL: function(url) {
            var param = url.split("?")[1];
            var url = url.split("?")[0];
            var params = param.split("&");
            var parLen = params.length;

            for (var i = 0; i < parLen; i++) {
                var paItem = params[i].split("=");
                url += url.indexOf("?") >= 0 ? "&" : "?";
                url += encodeURIComponent(paItem[0]) + "=" + encodeURIComponent(paItem[1]);
            }
            return url;
        },
    };

    // new Date().getTime()不够精确,加上count计数,确保唯一,也可以使用随机函数,但我认为这样更简单。
    if (window["count"]) {
        window["count"]++;
    } else {
        window["count"] = 1;
    }

    // requestId 唯一jsonp请求
    var requestId = "jsonp" + new Date().getTime() + window['count'];

    var head = document.getElementsByTagName("head")[0];
    var script = null;
    window[requestId] = {};

    // 请求值拼接到url

    if (options.data) {
        options.url = helper.joinURL(options.url, options.data);
    }

    //创建script结点
    script = document.createElement("script");
    if (options.url.indexOf("?") >= 0) {
        script.src = helper.encodeURL(options.url + "&callback=" + requestId + ".callback");
    } else {
        script.src = helper.encodeURL(options.url + "?callback=" + requestId + ".callback");
    }
    script.charset = "UTF-8";
    head.appendChild(script);
    window[requestId]["scriptNode"] = script;

    //重新封装回调函数,调用后应删除script结点,删除该请求信息。
    window[requestId]['callback'] = function(data) {
        try {
            options.callback && options.callback(data);
        } catch (e) {
            console.log(e);
        } finally {
            head.removeChild(window[requestId]["scriptNode"]);
            clearTimeout(window[requestId]["timer"]);
            delete window[requestId];
        }
    };

    // 超时调用
    window[requestId]["timer"] = setTimeout(function() {
        //抛出异常,并做异常处理
        try {
            throw new Error("over time");
        } catch (e) {
            if (options.fail) {
                options.fail(e.message);
            }
        }
        head.removeChild(window[requestId]["scriptNode"]);
        delete window[requestId];
    }, options.timeout);
}

 

转载于:https://www.cnblogs.com/AliceX-J/p/5889470.html

基于模拟退火的计算器 在线运行 访问run.bcjh.xyz。 先展示下效果 https://pan.quark.cn/s/cc95c98c3760 参见此仓库。 使用方法(本地安装包) 前往Releases · hjenryin/BCJH-Metropolis下载最新 ,解压后输入游戏内校验码即可使用。 配置厨具 已在2.0.0弃用。 直接使用白菜菊花代码,保留高级厨具,新手池厨具可变。 更改迭代次数 如有需要,可以更改 中39行的数字来设置迭代次数。 本地编译 如果在windows平台,需要使用MSBuild编译,并将 改为ANSI编码。 如有条件,强烈建议这种本地运行(运行可加速、可多次重复)。 在 下运行 ,是游戏中的白菜菊花校验码。 编译、运行: - 在根目录新建 文件夹并 至build - - 使用 (linux) 或 (windows) 运行。 最后在命令行就可以得到输出结果了! (注意顺序)(得到厨师-技法,表示对应新手池厨具) 注:linux下不支持多任务选择 云端编译已在2.0.0弃用。 局限性 已知的问题: - 无法得到最优解! 只能得到一个比较好的解,有助于开阔思路。 - 无法选择菜品数量(默认拉满)。 可能有一定门槛。 (这可能有助于防止这类辅助工具的滥用导致分数膨胀? )(你问我为什么不用其他语言写? python一个晚上就写好了,结果因为有涉及json读写很多类型没法推断,jit用不了,算这个太慢了,所以就用c++写了) 工作原理 采用两层模拟退火来最大化总能量。 第一层为三个厨师,其能量用第二层模拟退火来估计。 也就是说,这套方法理论上也能算厨神(只要能够在非常快的时间内,算出一个厨神面板的得分),但是加上厨神的食材限制工作量有点大……以后再说吧。 (...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值