欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

async await 就ajax因果调用解决方案(思路:以同步的思维解决异步的调用)

程序员文章站 2023-12-21 21:56:52
...

解释:async await 是es7中知识点,用babel可以进行转换

-为什么我们要这样做?-

例如,我们要一次调用多个ajax,但是我们知道的是不能保证顺序执行ajax。

聪明的朋友,会在一个ajax成功后再调用下一个ajax,但是如果我要调用多个n个ajax呢,那岂不是就是进入了回调地狱里了?!

因此,我们就用到了async await 以此顺序执行,即使你后一个ajax会用到上一个ajax回调后的参数,都不会影响!

ajax封装如下:

/**
     * @Ajax封装
     * 执行基本ajax请求,返回XMLHttpRequest
     *  $Ajax.request({
     *      url
     *      async 是否异步 true(默认)
     *      method 请求方式 POST or GET(默认)
     *      data 请求参数 (键值对字符串)
     *      success 请求成功后响应函数,参数为xhr
     *      error 请求失败后响应函数,参数为xhr 11
     *  });
     */
    let $Ajax = function() {
        let _onStateChange = (xhr, success, failure) => {
            if (xhr.readyState === 4) { //    请求已完成,且响应已就绪
                let _s = xhr.status; //   状态码
                if (_s >= 200 && _s < 300) {
                    success(xhr); //
                } else {
                    failure(xhr);
                }
            } else {}
        };
        let request = (opt) => {
            let _fn = () => {};
            let _url = opt.url || ''; //    获得url
            let _async = opt.async !== false,
                _method = opt.method || 'GET',
                _data = opt.data || null,
                _success = opt.success || _fn,
                _error = opt.failure || _fn;
            _method = _method.toUpperCase(); //  默认都转换大写
            if (_method === 'GET' && _data) {
                let _args = '';
                if (typeof _data === 'string') {
                    _args = _data;
                } else if (typeof _data === 'object') {
                    let _arr = new Array();
                    for (let _k in _data) {
                        let _v = _data[_k];
                        _arr.push(_k + '=' + _v);
                    }
                    _args = _arr.join('&');
                }
                _url += (_url.indexOf('?') === -1 ? '?' : '&') + _args;
                _data = null;
            }
            // var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveObject('Microsoft.XMLHTTP');
            let _xhr = window.XMLHttpRequest ? new XMLHttpRequest() : '';
            _xhr.onreadystatechange = () => { // 当请求被发送到服务器时,需要执行一些基于响应的任务
                _onStateChange(_xhr, _success, _error);
            };
            _xhr.open(_method, _url, _async); // 创建一个请求,并准备向服务器发送
            if (_method === 'POST') { //   如果是POST请求的时候,需要添加个请求消息头
                _xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded;');
            }
            _xhr.send(_data); //   向服务器发送请求
            return _xhr;
        };
        return {
            request: request
        };
    }();

async await 封装ajax如下:

function $myAjax(url, method, data, successed, failed) {
        let p = new Promise(function(resolve, reject) {
            $Ajax.request({
                url: url,
                method: method,
                data: data,
                success: function(resp) {
                    resolve(resp);
                    successed(resp);
                },
                failure: function(xhr) {
                    failed(xhr);
                    reject();
                }
            });
        });
        return p;
    }
    let $docs = document;
    $docs.getElementById('xxx').onclick = async function() {
        let resp1 = await $myAjax(url, 'get', { 'memberid': 1920744, 'activeid': 1 }, function(resp) {
            console.log(resp);
            console.log(2);
        }, function() {
            console.log('失败2');
        });
        let resp3 = await $myAjax(url, 'get', { 'memberid': 1920744, 'activeid': 1 }, function(resp) {
            console.log(resp);
            console.log(3);
        }, function() {
            console.log('失败3');
        });
    }


相关标签: ES7

上一篇:

下一篇: