Fork me on GitHub
随笔 - 265  文章 - 0  评论 - 1075  阅读 - 230万

模拟ajax的 script请求

复制代码
/**
     * 模拟ajax的 script请求
     * @param  {[type]} options [description]
     * @return {[type]}         [description]
     */
    function createAjax(options) {

        if (typeof url === "object") {
            options = url;
            url = undefined;
        }

        options = options || {};

        /**
         * 参数
         * jQuery.ajaxSetup 是默认参数
         * @type {[type]}
         */
        var s = jQuery.ajaxSetup({}, options);

        // Deferreds
        // 异步机制
        var deferred = jQuery.Deferred();
        var completeDeferred = jQuery.Callbacks("once memory");

        /**
         * 实际返回的ajax对象
         * @type {Object}
         */
        var jqXHR = {}

        // 把jqXHR对象转化promise对象,幷加入complete、success、error方法
        deferred.promise(jqXHR).complete = completeDeferred.add;
        //别名
        jqXHR.success = jqXHR.done;
        jqXHR.error = jqXHR.fail;

        // 增加回调队列
        // complete: function() {
        //     console.log('局部事件complete')
        // },
        // error: function() {
        //     console.log('局部事件error请求失败时调用此函数')
        // },
        // success: function() {
        //     console.log('局部事件success')
        // }
        for (i in {
            success: 1,
            error: 1,
            complete: 1
        }) {
            jqXHR[i](s[i]);
        }

        function send(_, complete) {
            var script = jQuery("<script>").prop({
                async: true,
                charset: s.scriptCharset,
                src: s.url
            }).on(
                "load error",
                callback = function(evt) {
                    script.remove();
                    callback = null;
                    if (evt) {
                        complete(evt.type === "error" ? 404 : 200, evt.type);
                    }
                }
            );
            document.head.appendChild(script[0]);
        }


        function done(status, nativeStatusText, responses, headers) {
            var isSuccess = status >= 200 && status < 300 || status === 304;
            var success = jqXHR.success;
            var error = jqXHR.error;
            if (isSuccess) {
                deferred.resolveWith(document, [success, jqXHR]);
            } else {
                deferred.rejectWith(document, [jqXHR, error]);
            }
        }

        //发送请求
        send({
            Accept: "text/javascript, application/javascript, application/ecmascri"
        }, done);

        return jqXHR;
    }

    function show(data){
        $('body').append('<li>'+ data +'</li>');
    }

        //执行一个异步的HTTP(Ajax)的请求。
        var ajax = createAjax({
            url: 'http://code.jquery.com/jquery-latest.js',
            dataType: 'script',
            //请求完成后回调函数 (请求success 和 error之后均调用)
            complete: function() {
                show('局部事件complete')
            },
            error: function() {
                show('局部事件error请求失败时调用此函数')
            },
            success: function() {
                show('局部事件success')
            }
        })

        ajax.done(function() {
           show('deferred done')
        }).fail(function() {
            show('deferred fail')
        }).always(function() {
            show('deferred lways')
        })
复制代码
posted on   【艾伦】  阅读(2596)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· [AI/GPT/综述] AI Agent的设计模式综述
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示