Promise封装ajax

Promise封装原生ajax

1.node的内置模块url, http

2.Promise封装原生ajax

01-node的内置模块

# url: 操作网址
let url = require('url')
url.parse('网址', [布尔值: 决定是否将查询字符串转换为对象格式]): 将网址解析成对象

# http: 创建本地服务器
let http = require('http')

let server = http.createServer(function (req, res) {
    // req: 前端提交的数据
    // res: 后端响应的内容
    console.log('服务器被访问了一次');
})
server.listen('8888', console.log('服务器启动成功'))

02-Promise封装ajax【面试题】

/* 
    参数:
        1. 请求地址,url: 必填
        2. 请求方式,method: 选填 默认get请求
        3. 提交的参数,data: 选填 默认值 ''
        4. post的请求头, headers:选填, 默认值 {content-type, 'application/x-www-form-urlencoded'}

    返回值:
        => 必须
        => 返回的内容可以是回调函数, 可能会造成回调地狱
        => 建议选择的是返回Promise,可以支持async/await

    函数封装的方法:相同部分放到函数体内,不同部分传参搞定

    函数封装的原则:尽可能的让程序的兼容性更强
        => 参数是否齐全
        => 参数的格式是否正确
    
*/

// 将对象转换为查询字符串
function queryStringify(data) {
    let str = ''
    for (let key in data) {
        str += `${key}=${data[key]}&`
    }
    return str.slice(0, -1)
}

function createAjax(url) {
    var BaseURL = url
    function ajax(options = {}) {
        // 这里options参数选择了对象:对象可以不用考虑参数的顺序
        // throw new Error(): 创建一个错误信息对象,并抛出(显示在控制台)
        // 1.1 请求地址是必填项
        if (!options.url) throw new Error('请求地址是必填项')
        // 1.2 请求方式 这个地方可以是undefined, 也可以是'GET'或'POST'
        if (!(options.method === undefined || /^(GET|POST)$/i.test(options.method))) {
            throw new Error('目前仅支持GET或POST,敬请期待更多方式')
        }
        // 1.3 提交的参数 这个地方也可以undefined,也可以是字符串,也可以是对象
        if (!(options.data === undefined || typeof options.data === 'string' || options.data.constructor === Object)) {
            throw new Error('支持的数据类型可以是字符串或者对象')
        }
        // 1.4 post请求头,可以是undefined, 也可以是表单格式提交
        if (/^POST$/i.test(options.method)) {
            if (!(options.headers === undefined || options.headers['content-type'] === 'application/x-www-form-urlencoded' || options.headers['content-type'] === 'application/json')) {
                throw new Error('post请求,必须设置请求头')
            }
        }


        // 如果options里面的参数不包含请求方式和提交参数,就要提供默认值
        let _default = {
            url: BaseURL + options.url,
            method: options.method || 'GET',
            data: options.data || '',
            headers: options.headers || { 'content-type': 'application/x-www-form-urlencoded' }
        }

        // 提交的参数的格式可以是对象形式,就需要将对象先转换成查询字符串,再做拼接
        if (_default.data.constructor === Object) _default.data = queryStringify(_default.data)

        // 注意:如果请求方式是get,并且需要携带参数,就需要把参数拼接在url地址的后面
        if (/^GET$/i.test(_default.method) && _default.data) _default.url += '?' + _default.data

        // 注意:发送了请求之后,希望可以接收到响应的数据,这里就使用了Promise, 再将结果resolve出去即可
        let p = new Promise((resolve, reject) => {
            // 2. 发起ajax请求
            // 2.1 创建一个实例对象,负责发起请求和接收响应的数据
            let xhr = new XMLHttpRequest()
            // 2.2 配置请求方式和请求地址
            xhr.open(_default.method, _default.url)
            // 2.3 设置请求头信息
            // xhr.setRequestHeader('content-type', 'application/x-www-form-urlencoded')
            if (/^POST$/i.test(_default.method)) xhr.setRequestHeader('content-type', _default.headers['content-type'])
            // // 2.4 发送请求
            xhr.send(/^POST$/i.test(_default.method) && _default.data)
            // 2.4 监听请求状态
            xhr.onreadystatechange = function () {
                // 如果请求的状态码等于4 并且 http请求码等于200
                if (xhr.readyState === 4 && xhr.status === 200) {
                    let res = JSON.parse(xhr.responseText)
                    // console.log(res);
                    resolve(res)
                }
            }
        })
        return p
    }
    return ajax
}

# 方法调用
 async function fun() {
     let ajax = createAjax('http://115.159.153.85:8001')
     let r1 = await ajax({
         url: '/getTest',
         // method: 'POST',
         // headers: { 'content-type': 'application/json' },
         data: {
             name: 'xdj',
             age: 18
         }
     })
     let r2 = await ajax({
         url: '/postTest',
         method: 'POST',
         // headers: { 'content-type': 'application/json' },
         data: {
             name: r1.msg.slice(0, 3),
             age: 18
         }
     })
  }
fun()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/499393.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AI预测福彩3D第20弹【2024年3月28日预测--第5套算法开始计算第2次测试】

今天,咱们继续进行本套算法的测试,今天为第二次测试,仍旧是采用冷温热趋势结合AI模型进行预测。好了,废话不多说了。直接上结果~ 仍旧是分为两个方案,1大1小。 经过人工神经网络计算并进行权重赋值打分后,3…

【论文阅读】ELA: Efficient Local Attention for Deep Convolutional Neural Networks

(ELA)Efficient Local Attention for Deep Convolutional Neural Networks 论文链接:ELA: Efficient Local Attention for Deep Convolutional Neural Networks (arxiv.org) 作者:Wei Xu, Yi Wan 单位:兰州大学信息…

【MySQL探索之旅】MySQL数据表的增删查改——约束

📚博客主页:爱敲代码的小杨. ✨专栏:《Java SE语法》 | 《数据结构与算法》 | 《C生万物》 《MySQL探索之旅》 |《Web世界探险家》 ❤️感谢大家点赞👍🏻收藏⭐评论✍🏻,您的三连就是我持续更…

【学习】企业为什么要做信创适配性测试

信创产业的发展不仅关乎国家的信息安全和自主可控,也直接关系到经济社会的创新和转型升级。因此,国家积极出台了一系列支持政策,以促进信创产业的快速发展。在各项政策出台的推动下,信创产品已经成为越来越多企业和机构的首选。信…

骨传导耳机哪个牌子值得入手?公认口碑排行前5名,强烈推荐!

我作为一名数码达人,对各类数码产品都了解的比较多,最近也会被很多人询问关于骨传导耳机哪个牌子好,哪个牌子值得入手的问题,后面了解后发现很多人入手的骨传导耳机都是劣质产品,在使用中经常遇到各类问题,…

【Go】结构体中Tag标识

https://blog.csdn.net/weixin_45193103/article/details/123876319 https://blog.csdn.net/qq_49723651/article/details/122005291 https://juejin.cn/post/7005465902804123679 学一点,整一点,基本都是综合别人的,弄成我能理解的内容 Tag定…

【JavaSE】java刷题——基础语法熟练应用

前言 通过本篇题目,可以让初学Java的小伙伴们更加熟练Java的基础语法~ 欢迎关注个人主页:逸狼 创造不易,可以点点赞吗~ 如有错误,欢迎指出~ 题1:数字9 出现的次数 题述:编写程序数一下 1到 100 的所有整数中…

四平方和定理

四平方和定理:任意一个正整数都可以被表示为至多四个正整数的平方和。 更强的结论:当且仅当时,n可以被表示为至多三个正整数的平方和,因此,当时,n只能被表示为四个正整数的平方和。 如果 ,这个时…

Leetcode - 周赛390

目录 一,3090. 每个字符最多出现两次的最长子字符串 二,3091. 执行操作使数据元素之和大于等于 K 三,3092. 最高频率的 ID 四,3093. 最长公共后缀查询 一,3090. 每个字符最多出现两次的最长子字符串 本题是一道标准…

JavaEE企业开发新技术4

2.16 模拟Spring IOC容器功能-1 2.17 模拟Spring IOC容器功能-2 什么是IOC? 控制反转,把对象创建和对象之间的调用过程交给Spring框架进行管理使用IOC的目的:为了耦合度降低 解释: 模仿 IOC容器的功能,我们利用 Map…

LeetCode 206.反转链表

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 示例 1: 输入:head [1,2,3,4,5] 输出:[5,4,3,2,1] 示例 2: 输入:head [1,2] 输出:[2,1] 示例 3: …

这款基于Vue的大数据可视化平台,你绝对值得拥有

这款基于Vue的大数据可视化平台,你绝对值得拥有 一、项目介绍二、相关技术栈三、运行步骤四、项目演示五、总结 大家好,这里是程序猿代码之路。今天主要给大家介绍一款基于Vue的可视化数据大屏。在数字化转型的浪潮中,大数据的可视化展示变得…

【Win】使用PowerShell和Webhooks轻松发送消息至Microsoft Teams

Microsoft Teams是一款由微软开发的团队协作和通讯工具。如果您对这个名字还不太熟悉,那么现在就是一个了解它的好时机。微软将Teams定位为其之前Skype for Business解决方案的继任者,并且它也提供了与其他基于频道的通讯应用程序(例如Slack、…

关于Devc++调试的问题以及解决STL变量无法查看

目前Devc的调试主要有以下几点: 1.调试不能直接查看stl变量,会卡死不动 2.目前单步进入只能用鼠标键按 3.若想按下一步进入函数体内,要在函数体内打上断点才行 4.调试到return 0 ;上一句就停了,不会结束程序 5.目前F2跳至断点…

30-3 越权漏洞 - 水平越权(横向越权)

环境准备:构建完善的安全渗透测试环境:推荐工具、资源和下载链接_渗透测试靶机下载-CSDN博客 一、定义 攻击者可以访问和操作与其拥有同级权限的用户资源。 示例: 学生A在教务系统上正常只能修改自己的作业内容,但由于不合理的权限校验规则等原因,学生A可以修改学生B的内…

文件夹中的文件如何全部加密

数字化时代,信息安全已成为我们日常生活中不可或缺的一部分。 而数据泄露和非法访问的风险却日益增加。 对于个人和企业而言,如何保护文件夹中的文件安全,防止数据被非法获取或篡改,是企业必须要重视的问题。 文件进行加密是一项…

【考研数学】听完课,汤家凤《1800题》基础练习都做不动?!

入门题基本都会,说明知识点学的没问题 但是一到基础就歇菜,说明题目综合度以上来,就没有思路,做不出来。 这种问题我在考研初期也遇到过,不要慌,这些都能够通过后期的练习弥补上来。 学习的过程其实很奇…

on-my-zsh 命令自动补全插件 zsh-autosuggestions 安装和配置

首先 Oh My Zsh 是什么? Oh My Zsh 是一款社区驱动的命令行工具,正如它的主页上说的,Oh My Zsh 是一种生活方式。它基于 zsh 命令行,提供了主题配置,插件机制,已经内置的便捷操作。给我们一种全新的方式使用命令行。…

.msi文件的安装

这里写目录标题 1.winR--》services.msc2.启动Windows Installer3.winR --》cmd4.输入命令,安装 1.winR–》services.msc 2.启动Windows Installer 3.winR --》cmd 4.输入命令,安装 msiexec/package 文件路径文件名 package和文件路径之间有个空格&#…

Unity颗粒血条的实现(原创,参考用)

1.创建3个静态物体摆好位置,并将其图层设为UI 2.编写一个脚本 using System.Collections; using System.Collections.Generic; using UnityEngine;public class xt : MonoBehaviour {public GameObject xt1;public GameObject xt2;public GameObject xt3;int x 1;…
最新文章