如何在微信小程序中优雅地发送异步请求

2023-11-06

一、微信小程序运行环境

微信小程序的 javascript 运行环境和浏览器不同,页面的脚本逻辑是在JsCore中运行,JsCore是一个没有窗口对象的环境,所以不能在脚本中使用window,也无法在脚本中操作组件,JsCore中也没有 XmlhttpRequest对象,所以jquery 、zepto、axios这些在小程序中都不能用。在微信小程序中,可以使用官方提供的wx.request进行异步请求操作

二、原生语法发送异步请求

在不进行封装的情况下,我们在项目的页面当中,可以小程序官方提供的API发起异步请求,例如:

wx.request({
  url: 'https://domain.com/1.1/classes/Stu',
  method:'POST',
  header:{
    'X-LC-Id': '自己的id', 
    'X-LC-Key': ' 自己的key', 
    'Content-Type': ' application/json'
  },
  data:{
    "name":"张无忌",
    "score":80,
    "gender":1
  },
  success:(res)=>{
    console.log(res);
  }
})

三、自定义封装异步请求

当然,从上面的异步请求代码可以看出,如果我们在每一个页面中,都直接用wx.request发起请求,会导致如下情况:

  1. baseURL没有统一提取,不方便开发环境、生产环境之间的灵活切换

  2. header请求头所携带的信息,需要每次异步请求的时候手动追加

  3. 代码冗余度高

所以我们可以基于Promise对象,将wx.request进行二次封装

let base = 'https://domain.com/1.1'

function fetchData(url,data,method="GET"){
  return new Promise((resolve,reject)=>{
    wx.request({
      url: base+url,
      method,
      header:{
        'X-LC-Id': '自己的id', 
        'X-LC-Key': ' 自己的key', 
        'Content-Type': ' application/json'
      },
      data,
      success:(res)=>{
        resolve(res)    //此处的res会交给then
      },
      fail:(err)=>{
        reject(err)  //此处的err会交给catch
      }
    })
  })
}

function post(url,data={}){
  return http(url,data,'POST')
}

function get(url,data={}){
  return http(url,data,'GET')
}

module.exports = {
  fetchData,
  post,
  get
}

封装之后,我们可以将封装的模块在app.js中,挂载至全局属性

// app.js
let request = require('./utils/request')
App({
  onLaunch: function() {},
  ...request
})

后续在项目页面中需要发起异步请求的时候,只需要通过getApp()调用全局挂载的异步方法发起请求,极大降低代码冗余度,提高开发效率。

Page({
  bindViewTap(){
    let data = {
      "name":"张无忌",
      "score":80,
      "gender":1
    }
    getApp().post('/classes/Stu',data).then(res=>{
      console.log(res) 
    })
  }
})

四、使用fly.js处理异步请求

当然,我们自己封装的异步模块,很多时候,它的拓展性,复用性各方面的完善度相对较低。所以我们也可以采用一款开源的,支持微信小程序平台的异步请求库 fly.js 来完成项目中的异步请求。

1.首先下载fly.js提供的适配微信小程序的异步请求模块,将其存放之项目的lib目录下

下载地址:

https://github.com/wendux/fly/tree/master/dist/npm/wx.js

2.对fly.js方法进行全局配置封装,添加拦截器等操作_//添加响应拦截器,响应拦截器会在then/catch处理之前执行

var Fly=require("../lib/wx") //wx.js为您下载的源码文件
// var Fly=require("flyio/dist/npm/wx") //npm引入方式
var fly=new Fly(); //创建fly实例

//添加请求拦截器
fly.interceptors.request.use((config,promise)=>{
    //给所有请求添加自定义header
    config.headers["X-Tag"]="flyio";
    return config;
})
//添加响应拦截器,响应拦截器会在then/catch处理之前执行
fly.interceptors.response.use(
    (response) => {
        //只将请求结果的data字段返回
        return response.data
    },
    (err) => {
        //发生网络错误后会走到这里
        //return Promise.resolve("ssss")
    }
)
//配置请求基地址
fly.config.baseURL="https://domain.com/1.1"
fly.config.headers={
  'X-LC-Id': '自己的id', 
  'X-LC-Key': ' 自己的key', 
  'Content-Type': ' application/json'
}
  1. 在项目页面中,可以直接使用封装后的fly模块进行异步请求

Page({
  //事件处理函数
  bindViewTap: function() {
    let data = {
      "name":"张无忌",
      "score":80,
      "gender":1
    }
    fly.post('/classes/Stu',data).then((d)=>{
      //输出请求数据
      console.log(d.data)
      //输出响应头
      console.log(d.header)
    }).catch(err=>{
      console.log(err.status,err.message)
    })
    ...
  })
})

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在微信小程序中优雅地发送异步请求 的相关文章

随机推荐

  • LC滤波器简单设计法 - 一文读懂LC滤波器简单设计方法及原理介绍,LC值计算方法

    LC滤波器简单设计法 一文读懂LC滤波器简单设计方法及原理介绍 LC值计算方法 LC滤波器概述 LC滤波器也称为无源滤波器 是传统的谐波补偿装置 LC滤波器之所以称为无源滤波器 顾名思义 就是该装置不需要额外提供电源 LC滤波器一般是由滤波
  • 【Python进阶学习】根据数据绘制省份热力地图(源码)

    输入 pro sales csv 省份与值 数据 province 省份列 deal 值列 输出 中国地图 html 优化 显示省份名称 使用notepad 打开中国地图 html 搜索 series 在1900多行这个 3 增加以下内容
  • mybatis utf8mb4 java_java.sql.SQLException: Unsupported character encoding 'utf8mb4'.

    四月 12 2017 3 47 52 下午 org apache catalina core StandardWrapperValve invoke 严重 Servlet service for servlet SpringMVC in c
  • 深度学习拾遗

    深度学习 hinton bp算法 李飞飞 吴恩达 黄广斌 路奇 深度学习优化的超参数 1 学习率 学习率 learning rate或作lr 是指在优化算法中更新网络权重的幅度大小 学习率可以是恒定的 逐渐降低的 基于动量的或者是自适应的
  • 面向高维优化问题的混沌粒子群混合蝴蝶优化算法(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 Matlab代码及详细文章讲解 4 参考文献 1 概述 文献来源 摘要 为了解决蝶形优化
  • 值类别 左值引用 右值引用

    文章目录 值类别 关系图 示例 左值引用声明符 语法 示例 反汇编 伪代码 右值引用声明符 语法 示例 反汇编 伪代码 相关参考 值类别 每个 C 表达式 运算符带上其操作数 字面量 变量名等 可按照两种独立的性质加以辨别 类型和值类别 v
  • 快手java开发面试经验大全

    1 自我介绍 2 java集合 hashmap详细介绍 关键参数 线程安全的集合 队列和栈 用两个栈实现队列算法 3 jvm结构 4 多线程锁 synchronized reentrantlock countdownlatch 锁升级 5
  • 回归(regression)和logistic regression

    回归 回归 就是 回归本质 的意思 用一个函数去拟合一组数据 xi yi x i y i 随着数据越来越多 用来拟合的这个曲线就越来越接近真实的情况 这里 xi x i可以是一个向量 假设 xi Rn x i in R n 若用线性回归的方
  • 如何创建 且在idea中操作vue3项目

    一 使用vue的控制台创建vue3项目 1 首先使用vue的控制台创建基础的vue框架 win r 唤出控制台 输入cmd 在控制台中输入 vue ui 弹出一个网页窗口 在弹出的窗口中点击下面这个地方 选择你要存放的地址 点击再次创建项目
  • Long 类型比较 判断相等问题引发的问题

    项目场景 最近上线以后遇到的一个问题 在这里记录一下 问题描述 测试的时候没问题 放到生产上就有问题了 原因分析 当时在测试上是没问题的 在生产上用同样的环境 同样的数据测试也是没问题的 把生产上数据同步到本地测试了一下 果然有问题 解决方
  • 物联网技术

    作者 阏男秀 链接 https www zhihu com question 50125636 answer 124938067 来源 知乎 著作权归作者所有 商业转载请联系作者获得授权 非商业转载请注明出处 物联网技术之四 无线自组网 无
  • springboot(一):构建最简单的springboot项目

    springboot应该是在spring体系基础上发展起来的 使用springboot 可以快速构建开发项目 并快速集成相关组件 很多开源的组件都有springboot的实现了 有人说它的设计理念为约定大于配置 就是好比说在springbo
  • 为什么Centos装上以后,执行apt-get命令提示没有该命令

    CentOS的软件安装工具不是apt get 是yum yum y install 你要安装的文件
  • java最大堆空间会自动扩增吗_最大化Java堆空间

    我试图在 Java中使用非常大的方阵 n 1e6或更大的数量级 矩阵不是稀疏的 所以我没有看到很多方法将它们表示为2D数组 这需要n 2 sizeof int 位的内存 显然 我正在获得堆溢出错误 即使添加编译器标志来使用我的机器将允许的大
  • 二十九.刷题.19

    输入两点坐标 X1 Y1 X2 Y2 0 lt x1 x2 y1 y2 lt 1000 计算并输出两点间的距离 include
  • centos7.3 32位 安装ssh实现远程登陆

    centos7 3 32位 安装ssh实现远程登陆 安装ssh sudo yum install openssh 关闭防火墙 永久禁用 sudo systemctl disable firewalld 重启ssh sudo systemct
  • 流动的数据——使用 RxJS 构造复杂单页应用的数据逻辑

    感谢作者徐飞的授权发布 作者 徐飞 网名民工精髓V 曾任Teambition前端架构师 苏宁云计算中心前端架构师 有十年以上大型企业应用前端架构及开发经验 熟悉AngularJS等框架 对Web组件化有一些思考 博客地址 https git
  • 微软server2012服务器端客户端,windows server 2012 datacenter配置iSCSI目标服务器和客户端配置...

    您好 1 在添加角色时 添加 文件和存储服务 文件和iSCSI服务 iSCSI目标存储提供程序 VDS和VSS硬件提供程序 这项主要的作用是什么 在配置iSCSI目标服务器时 有没有必要安装 这个应该 是 让 iscsi 卷 支持 VSS
  • gitee配置SSH公钥

    第一步 找个地方打开 git bash 然后输入生成ssh公钥的命令 ssh keygen t rsa C your email 然后敲四次回车生成公钥 第二步 输入查看公钥的命令 cat ssh id rsa pub 结果如下 第三步 将
  • 如何在微信小程序中优雅地发送异步请求

    一 微信小程序运行环境 微信小程序的 javascript 运行环境和浏览器不同 页面的脚本逻辑是在JsCore中运行 JsCore是一个没有窗口对象的环境 所以不能在脚本中使用window 也无法在脚本中操作组件 JsCore中也没有 X