利用promise及参数解构封装ajax请求的方法


Posted in Javascript onMarch 24, 2021

1.前端代码

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <meta name="viewport" content="width=device-width, initial-scale=1.0">
 <title>Document</title>
</head>
<body>
 <script>
 /**
  * type: get/post
  * url: http://localhost:3000 http://localhost:3000/details http://localhost:3000/users
  * data: lid=5 / uname=lili&upwd=123456
  * dataType: '' / 'json', 如果服务端返回的是json格式字符串,就通过dataType通知ajax函数自动转换为对象
  * **/
 ajax({
  type: 'get',
  url: 'http://localhost:3000',
  dataType: 'json'
 })
 // data 不写在解构时值默认为 data: undefined
 ajax({
  type: 'get',
  url: 'http://localhost:3000/details',
  data: 'lid=0',
  dataType: 'json'
 })
 ajax({
  type: 'post', 
  url: 'http://localhost:3000/users', 
  data: 'uname=lili&upwd=123456',
 }).then(function(res){
  alert(res)
 })
 // dataType 不写在解构时值默认为 dataType: undefined
 
 function ajax({type, url,data, dataType}){
  return new Promise(function(open){
  var xhr = new XMLHttpRequest()
  xhr.onreadystatechange = function(){
   if(xhr.readyState === 4 && xhr.status === 200){
   if(dataType === 'json'){
    var res = JSON.parse(xhr.responseText)
   }else{
    var res = xhr.responseText
   }
   console.log(res)
   open(res)
   }
  }
 
  if(type === 'get' && data !== undefined){
   url += `?${data}`
  }
  xhr.open(type, url, true)
  xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded')
 
  if(type === 'get'){
   xhr.send()
  }else{
   xhr.send(data)
  }
  })
 }
 </script>
</body>
</html>

另:ajax实际代码实现如下

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <meta name="viewport" content="width=device-width, initial-scale=1.0">
 <title>Document</title>
</head>
<body>
 <script>
 var xhr = new XMLHttpRequest()
 xhr.onreadystatechange = function(){
  if(xhr.readyState === 4 && xhr.status === 200){
  console.log(xhr.responseText)
  }
 }
 xhr.open('get', 'http://localhost:3000', true)
 xhr.send()
 </script>
</body>
</html>

2.后端代码

1) 创建一个后端项目

利用promise及参数解构封装ajax请求的方法

2) 在routes下创建index.js,users.js,代码如下

// index.js
var express = require('express');
var router = express.Router();
 
/* GET home page. */
var products = [
 {
 lid:1,
 pname:'笔记本',
 price:3400
 },
 {
 lid:2,
 pname:'手机',
 price:5400
 },
 {
 lid:3,
 pname:'iPad',
 price:6400
 }
]
 
router.get('/', function(req, res, next) {
 res.send(products)
});
 
router.get('/details', function(req, res, next){
 var lid = req.query.lid
 res.send(products[lid])
})
 
module.exports = router;
// user.js
var express = require('express');
var router = express.Router();
 
/* GET users listing. */
router.post('/', function(req, res, next) {
 var uname = req.body.uname
 var upwd = req.body.upwd
 if(uname === 'lili' && upwd === '123456'){
 res.send('登陆成功')
 }else{
 res.send({
  code: 0,
  message: '用户名或密码错误'
 })
 }
});
 
module.exports = router;

3.注:

为避免跨域,可将前端代码和后端同时放在一个项目内,使用同一地址,再发送请求调取接口

Javascript 相关文章推荐
Jsonp 跨域的原理以及Jquery的解决方案
May 18 Javascript
js限制textarea每行输入字符串长度的代码
Oct 31 Javascript
高效的获取当前元素是父元素的第几个子元素
Oct 15 Javascript
onkeyup,onkeydown和onkeypress的区别介绍
Oct 21 Javascript
ExtJS4给Combobox设置列表中的默认值示例
May 02 Javascript
JS代码防止SQL注入的方法(超简单)
Apr 12 Javascript
Jquery实现select multiple左右添加和删除功能的简单实例
May 26 Javascript
运用jQuery写的验证表单(实例讲解)
Jul 06 jQuery
jQuery中ajax获取数据赋值给页面的实例
Dec 31 jQuery
webpack配置proxyTable时pathRewrite无效的解决方法
Dec 13 Javascript
Vue插件之滑动验证码
Sep 21 Javascript
Vue快速实现通用表单验证功能
Dec 05 Javascript
AJAX检测用户名是否存在的方法
Mar 24 #Javascript
js正则匹配markdown里的图片标签的实现
浅谈react路由传参的几种方式
Mar 23 #Javascript
一百多行代码实现react拖拽hooks
node中使用shell脚本的方法步骤
详解如何解决使用JSON.stringify时遇到的循环引用问题
vue 中 get / delete 传递数组参数方法
Mar 23 #Vue.js
You might like
在php中取得image按钮传递的name值
2006/10/09 PHP
dedecms后台验证码总提示错误的解决方法
2007/03/21 PHP
Laravel 5框架学习之Eloquent (laravel 的ORM)
2015/04/08 PHP
php微信公众号开发之现金红包
2018/04/16 PHP
accesskey 提交
2006/06/26 Javascript
javascript 数组的方法集合
2008/06/05 Javascript
jQuery 顺便学习下CSS选择器 奇偶匹配nth-child(even)
2010/05/24 Javascript
Jquery ui css framework
2010/06/28 Javascript
jQuery中:nth-child选择器用法实例
2014/12/31 Javascript
javascript原生ajax写法分享
2016/04/10 Javascript
EditPlus 正则表达式 实战(3)
2016/12/15 Javascript
Highcharts+NodeJS搭建数据可视化平台示例
2017/01/01 NodeJs
使用 Node.js 对文本内容分词和关键词抽取
2017/05/27 Javascript
jquery实现一个全局计时器(商城可用)
2017/06/30 jQuery
ReactNative之FlatList的具体使用方法
2017/11/29 Javascript
Angular简单验证功能示例
2017/12/22 Javascript
QQ跳转支付宝并自动领红包脚本(最新)
2018/06/22 Javascript
layui的面包屑或者表单不显示的解决方法
2019/09/05 Javascript
[03:57]2016完美“圣”典风云人物:rOtk专访
2016/12/09 DOTA
[52:00]2018DOTA2亚洲邀请赛 4.1 小组赛 A组加赛 LGD vs Optic
2018/04/02 DOTA
Python内置函数bin() oct()等实现进制转换
2012/12/30 Python
python+ffmpeg视频并发直播压力测试
2018/03/06 Python
Python3 Post登录并且保存cookie登录其他页面的方法
2018/12/28 Python
Python基于datetime或time模块分别获取当前时间戳的方法实例
2019/02/19 Python
Python CSV文件模块的使用案例分析
2019/12/21 Python
python GUI库图形界面开发之PyQt5控件数据拖曳Drag与Drop详细使用方法与实例
2020/02/27 Python
整理HTML5的一些新特性与Canvas的常用属性
2016/01/29 HTML / CSS
Auchan Direct波兰:欧尚在线杂货店
2016/10/19 全球购物
英国时尚女装购物网站:Missguided
2018/08/23 全球购物
MYSQL相比于其他数据库有哪些特点
2013/07/19 面试题
办公室行政主管岗位职责
2015/04/09 职场文书
2015年领班工作总结
2015/04/29 职场文书
观看焦裕禄观后感
2015/06/09 职场文书
将图片保存到mysql数据库并展示在前端页面的实现代码
2021/05/02 MySQL
实战 快速定位MySQL的慢SQL
2022/03/22 MySQL
PostgreSQL并行计算算法及参数强制并行度设置方法
2022/04/06 PostgreSQL