uniapp项目实战系列(4):服务的异步请求,请求服务的二次封装

目录

  • 系列往期文章(点击跳转)
    • uniapp项目实战系列(1):导入数据库,启动后端服务,开启代码托管(点击跳转)
    • uniapp项目实战系列(2):新建项目,项目搭建,微信开发工具的配置(点击跳转)
    • uniapp项目实战系列(3):底部导航栏与头部导航栏的配置(点击跳转)
  • 1.介绍
  • 2.功能搭建流程
    • 2.1启动后端服务
    • 2.2请求获取轮播图数据
      • 2.2.1整体的请求
      • 2.2.3网络请求后立即回调(可以用于需要同步,一个接一个的调用)
      • 2.2.3异步async/awit网络请求
    • 2.3详细介绍es6的语法:aysnc/awit(了解可跳过)
      • 2.3.1.async/await的语法
      • 2.3.2.async/await的用法
      • 2.3.3.async/await的原理
      • 2.3.4.async/await的注意事项
    • 2.4uni.request网络请求的二次封装和全局挂载
      • 2.4.1编写api.js
      • 2.4.2在mian.js中进行导入和全局挂载
      • 2.4.3在请求轮播图数据中使用封装后的uni.request
    • 2.5利用获取到的数据渲染到页面上
    • 3.完整代码
    • 3.1.api.js:
    • 3.2main.js:
    • 3.3index.vue:


✨ 原创不易,还希望各位大佬支持一下!

👍 点赞,你的认可是我创作的动力!

⭐️ 收藏,你的青睐是我努力的方向!

✏️ 评论,你的意见是我进步的财富!


系列往期文章(点击跳转)

uniapp项目实战系列(1):导入数据库,启动后端服务,开启代码托管(点击跳转)

uniapp项目实战系列(2):新建项目,项目搭建,微信开发工具的配置(点击跳转)

uniapp项目实战系列(3):底部导航栏与头部导航栏的配置(点击跳转)

1.介绍

本文主要是轮播图数据的请求与渲染和网络请求的封装
在本文章中学会在服务的异步请求,请求服务的二次封装

2.功能搭建流程

2.1启动后端服务

在这里插入图片描述需要注意的是后端服务的cmd不能关闭哦,关闭了就本地的后端服务就停止了

2.2请求获取轮播图数据

2.2.1整体的请求

下图为:未封装网络请求以及不进行异步操作的整个页面请求
在data中设置变量存放数据
在onLoad(页面加载时)设置获取轮播图数据的方法
在methods中编写请求轮播图数据的方法
uni.request:发起网络请求(文档地址)
uni.showToast:显示消息提示框(文档地址)
tips:
1.axios只有浏览器支持,为了用多端要用uni提供的请求了
2.uniapp App端没有浏览器对象,不支持axios,请用官方的API:uni.request() ,打开调试能用是因为调试的时候JS是在电脑运行的,而电脑带有浏览器端对象
3.localhost 的 IP 地址是 127.0.0.1,所以说http://127.0.0.1:8082=http://localhost:8082
4.设计稿是按照375px*2=750px,是2倍图,750rpx相当于设计稿的全部宽度,1px=2rpx

在这里插入图片描述

2.2.3网络请求后立即回调(可以用于需要同步,一个接一个的调用)

这个函数中,getSwipers()使用了标准的回调方式来处理异步请求。当uni.request()发起网络请求后,该函数会立即返回,然后在请求成功或失败后的回调函数中执行相应的逻辑。这种方式在早期的JavaScript中非常常见,但随着异步处理的需求越来越复杂,这种方式往往会导致代码变得难以管理和理解,因为它涉及到回调函数的嵌套和"回调地狱"等问题。
在这里插入图片描述

2.2.3异步async/awit网络请求

这个函数中,getSwipers()使用了ES6引入的async/await语法来处理异步请求。这种方式使得异步代码看起来更像同步代码,使得代码更容易理解和维护。
在这里插入图片描述

2.3详细介绍es6的语法:aysnc/awit(了解可跳过)

在JavaScript中,异步调用是一种在执行过程中暂停当前执行,等待某个操作完成后继续执行的方式。这种机制可以避免阻塞主线程,提高程序的性能。
在JavaScript中,常见的异步方式有回调函数、Promise、async/await等。其中,async/await是ES2017引入的一种基于Promise的异步方式,它更加简洁、易于理解和使用。

2.3.1.async/await的语法

async表示函数是异步的,await表示在函数内部等待某个异步操作完成。
示例代码:

async function asyncFunc() {  
  const result = await asyncOperation();  
  console.log(result);  
}

在上面的代码中,asyncFunc是一个异步函数,它内部调用了另一个异步函数asyncOperation,并使用await等待其完成。当await的表达式返回结果后,asyncFunc继续执行后续代码。

2.3.2.async/await的用法

async/await是基于Promise实现的,因此Promise的所有操作都可以使用async/await进行异步操作。
示例代码:

async function asyncFunc() {  
  try {  
    const result = await promise(); // 等待promise完成并返回结果  
    console.log(result);  
  } catch (error) {  
    console.error(error); // 处理promise抛出的错误  
  }  
}

在上面的代码中,我们使用了try…catch结构来处理Promise可能抛出的错误。在try块中使用await等待Promise完成,并在需要时处理返回的结果。如果Promise抛出错误,catch块会捕获并处理该错误。

2.3.3.async/await的原理

async/await是通过将Promise对象转换为生成器实现的。具体来说,当一个函数被声明为async时,JavaScript会将该函数转换为生成器函数,并在函数内部使用Promise对象进行异步操作。当await表达式等待Promise完成时,JavaScript会暂停当前生成器函数的执行,等待Promise完成并返回结果后继续执行生成器函数。这种机制使得异步操作更加简洁、易于理解和使用。

2.3.4.async/await的注意事项

只能在async函数内部使用await,否则会抛出错误。
await的表达式必须是Promise对象,否则会直接返回该表达式的值。
使用await时必须用try…catch结构处理Promise可能抛出的错误。
如果一个async函数没有return语句或者return了一个未经await的Promise对象,该函数将返回一个Promise对象,并且该Promise将在函数结束时resolve为undefined。

2.4uni.request网络请求的二次封装和全局挂载

2.4.1编写api.js

这段代码是用于创建HTTP请求的JavaScript函数。它使用了ES6的模块导出和箭头函数,并且使用了uni.request函数来发送请求。这是一个基于Promise的异步函数,它返回一个Promise对象。
1.const BASE_URL = ‘http://127.0.0.1:8082’:定义了一个常量 BASE_URL,它是一个基础的URL,这个URL会作为所有请求的起点。
2.export const myRequest = (options) => { … }:定义了一个名为 myRequest 的函数,并将它导出。这个函数接收一个对象 options 作为参数,该对象应该包含 url、method 和 data 属性。
3.return new Promise((resolve, reject) => { … }):在函数内部,创建了一个新的Promise对象,并返回它。Promise是一个用于处理异步操作的JavaScript对象。resolve 和 reject 是Promise对象的两个回调函数,当Promise的状态从pending变为fulfilled时,resolve 函数会被调用;当Promise的状态从pending变为rejected时,reject 函数会被调用。
4.uni.request({ … }):使用 uni.request 函数发送一个HTTP请求。这个函数应该是一个提供异步请求功能的库或者API的一部分。它接收一个包含多个属性的对象作为参数,包括请求的URL、请求的方法(默认为GET)、请求的数据等。
5.url: BASE_URL + options.url,:拼接基础URL和请求的URL,得到完整的请求URL。
6.method: options.method || ‘GET’, data: options.data || {}:如果 options 对象有 method 和 data 属性,则使用这些属性的值;否则,使用默认值 ‘GET’ 和一个空对象。
7.success: (res) => { … }, fail: (err) => { … }:这两个属性是 uni.request 的回调函数。如果请求成功,会执行 success 回调;如果请求失败,会执行 fail 回调。
8.if (res.data.status !== 0) { … }:在 success 回调中,检查响应的数据中的状态是否为0。如果状态不为0,表示获取数据失败,显示一个提示信息,并拒绝Promise。
9.resolve(res):如果获取数据成功,那么就通过 resolve 回调将响应的结果返回,使得Promise的状态变为fulfilled。
uni.showToast({ … }):这是一个自定义的函数,它可能用于在前端展示一个提示信息。
10.reject(err):如果请求失败,那么就通过 reject 回调将错误信息返回,使得Promise的状态变为rejected。
在这里插入图片描述

2.4.2在mian.js中进行导入和全局挂载

这段代码是用于在 Vue.js 中引入并设置一个全局的函数 m y R e q u e s t 。 myRequest。 myRequestmyRequest 函数在后续的 Vue.js 组件中可以直接调用。
1.import {myRequest} from ‘uni/api.js’:从 ‘uni/api.js’ 文件中引入 myRequest 函数。
2.Vue.prototype. m y R e q u e s t = m y R e q u e s t :将 m y R e q u e s t 函数赋值给 V u e 的原型对象。这意味着在所有的 V u e 组件中,都可以通过 t h i s . myRequest = myRequest:将 myRequest 函数赋值给 Vue 的原型对象。这意味着在所有的 Vue 组件中,都可以通过 this. myRequest=myRequest:将myRequest函数赋值给Vue的原型对象。这意味着在所有的Vue组件中,都可以通过this.myRequest 来调用这个函数。
在这里插入图片描述

2.4.3在请求轮播图数据中使用封装后的uni.request

在这里插入图片描述

2.5利用获取到的数据渲染到页面上

在这里插入图片描述

3.完整代码

3.1.api.js:

const BASE_URL = 'http://127.0.0.1:8082'
export const myRequest = (options) => {
  return new Promise((resolve, reject) => {
    uni.request({
      url: BASE_URL + options.url,
      method: options.method || 'GET',
      data: options.data || {},
      success: (res) => {
        if (res.data.status !== 0) {
          return uni.showToast({
            title: '获取数据失败'
          })
        }
        resolve(res)
      },
      fail: (err) => {
        uni.showToast({
          title: '请求接口失败'
        })
        reject(err)
      }
    })
  })
}

这段代码是使用 JavaScript 编写的,并使用了一个叫做 uni 的库(通常在微信小程序等环境中使用)。它定义了一个名为 myRequest 的函数,该函数用于向指定的 URL 发送 HTTP 请求。
这个函数接收一个参数 options,该参数是一个对象,包含以下属性:

  • url: 请求的 URL。它将被添加到 BASE_URLhttp://127.0.0.1:8082)上。
  • method: 请求的 HTTP 方法,默认为 GET。
  • data: 要发送的数据,默认为空对象。
    函数返回一个 Promise,该 Promise 在请求成功时解析为响应,在请求失败时被拒绝。
    以下是函数的具体操作:
  1. uni.request 是一个函数,用于发送 HTTP 请求。它接收一个包含请求信息的对象作为参数。
  2. success 回调中,如果响应数据的 status 属性不等于 0,那么会显示一个错误提示('获取数据失败')。否则,将解析 Promise,并将响应作为结果返回。
  3. fail 回调中,无论请求是否成功,都会显示一个错误提示('请求接口失败'),并将错误拒绝到 Promise 中。

总的来说,这个函数提供了一种异步的方式去发送 HTTP 请求,并且对请求的成功和失败进行了基本的错误处理。

3.2main.js:

import {myRequest} from 'uni/api.js'
Vue.prototype.$myRequest = myRequest

这段代码是用于在 Vue.js 中引入并暴露 myRequest 函数的。
具体来说,它做了以下几件事:

  1. import {myRequest} from 'uni/api.js':这行代码从 ‘uni/api.js’ 文件中导入 myRequest 函数。这个文件可能包含了一些在 ‘uni’ 环境下使用的 API,例如在微信小程序中。
  2. Vue.prototype.$myRequest = myRequest:这行代码将 myRequest 函数添加到 Vue 的原型上,使得在任何 Vue 实例中都可以通过 this.$myRequest 来访问这个函数。这是一种常见的在 Vue.js 中添加全局函数或属性的方式。
    所以,现在你可以在任何 Vue 组件中使用 this.$myRequest 来调用 myRequest 函数,进行你的 HTTP 请求。

3.3index.vue:

<template>
  <view>
    <!-- 轮播图区域 -->
    <swiper :autoplay='true' :circular="true" >
      <swiper-item v-for="item in swipers" :key="item.id">
        <image :src="item.img"></image>
      </swiper-item>
    </swiper>
  </view>
</template>

<script>
  export default {
    data() {
      return {
        swipers: [], //轮播图的数据
      }
    },
    onLoad() {
      this.getSwipers() //页面加载时获取轮播图的数据
    },
    methods: {
      //封装时异步获取数据
      async getSwipers() {
        const res = await this.$myRequest({
          url: '/api/getlunbo'
        })
        this.swipers = res.data.message
      },
    }
  }
</script>

<style lang="scss" scoped>
  swiper {
    height: 200rpx;
    image {
      width: 100%;
      height: 100%;
    }
  }
</style>

这是一个使用 Vue.js 构建的组件,该组件用于在页面上展示一个轮播图。
以下是代码的详细解释:

  1. <template> 部分,我们有一个 swiper 组件,这是一个轮播图组件。:autoplay='true' 表示轮播图将自动播放,:circular="true" 表示轮播图是循环播放的。
  2. 在每个 swiper-item 中,我们用 v-for 指令循环渲染 swipers 数组中的每个元素。每个元素都是一个轮播图项,其图片通过 :src="item.img" 绑定。
  3. <script> 部分,我们定义了一个 Vue 组件。这个组件有一个 data 函数,它返回一个对象,其中包含 swipers 数据。这个数组用来存储轮播图的数据。
  4. onLoad() 是一个生命周期钩子,当组件加载完成时,它将调用 getSwipers() 方法获取轮播图的数据。
  5. getSwipers() 方法使用 this.$myRequest() 发送一个 HTTP 请求到 ‘/api/getlunbo’ URL 来获取轮播图的数据。获取到的数据被赋值给 swipers
  6. 最后,在 <style> 部分,我们为 swiper 和其中的 image 元素定义了一些样式。轮播图的高度被设置为200rpx(可能是像素或者其他单位),图片的宽度和高度都被设置为100%,使得图片能完全填充其父元素。

总的来说,这是一个简单的轮播图组件,它通过异步获取数据并动态渲染轮播图项。

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

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

相关文章

七、高并发内存池--Page Cache

七、高并发内存池–Page Cache 7.1 PageCache的工作原理 PageCache是以span的大小(以页为单位)和下标一一对应为映射关系的哈希桶&#xff0c;下标是几就说明这个哈希桶下挂的span的大小就是几页的&#xff0c;是绝对映射的关系。因为PageCache也是全局只有唯一一个的&#x…

线上批量查询物流导出到表格的操作指南

现在的生活中&#xff0c;我们经常需要查询包裹物流信息。如果一次性需要查询多个快递单号的物流信息&#xff0c;手动一个一个查询会非常麻烦。今天&#xff0c;我将向大家分享一个简单实用的方法&#xff0c;可以批量查询物流并导出到表格&#xff0c;方便随时查看。 首先&am…

js 正则表达式 验证 :页面中一个输入框,可输入1个或多个vid/pid,使用英文逗号隔开...

就是意思一个输入框里面&#xff0c;按VID/PID格式输入,VID和PID最大长度是4,最多50组 1、页面代码 <el-form ref"ruleForm" :model"tempSet" :rules"rules" label-position"right"> <!-- 最多 50组&#xff0c;每组9个字符…

【USRP】集成化仪器系列1 :信号源,基于labview实现

USRP 信号源 1、设备IP地址&#xff1a;默认为192.168.10.2&#xff0c;请勿 修改&#xff0c;运行阶段无法修改。 2、天线输出端口是TX1&#xff0c;请勿修改。 3、通道&#xff1a;0 对应RF A、1 对应 RF B&#xff0c;运行 阶段无法修改。 4、中心频率&#xff1a;当需要…

LinuxUbuntu安装OpenWAF

Linux&Ubuntu安装OpenWAF 官方GitHub地址 介绍 OpenWAF&#xff08;Web Application Firewall&#xff09;是一个开源的Web应用防火墙&#xff0c;用于保护Web应用程序免受各种网络攻击。它通过与Web服务器集成&#xff0c;监控和过滤对Web应用程序的流量&#xff0c;识…

JDK源码解析-LinkedList

1. LinkedList类 1.1 LinkedList类定义&数据结构 定义 LinkedList是一种可以在任何位置进行高效地插入和移除操作的有序序列&#xff0c;它是基于双向链表实现的。 数据结构 基础知识补充 单向链表&#xff1a; element&#xff1a;用来存放元素 next&#xff1a;用来…

Redis 7 第六讲 主从模式(replica)

🌹🌹🌹 此篇开始进入高级篇范围(❤艸`❤) 理论 即主从复制,master以写为主,Slave以读为主。当master数据变化的时候,自动将新的数据异步同步到其它slave数据库。 使用场景 读写分离 容灾备份数据备份水平扩容主从架构 演示案例 注:masterauth、replicaof主…

FTP文件传输服务器

目录 一、FTP协议两种工作模式 二、FTP数据两种传输模式 三、FTP用户分类 四、VSFTP配置案例 4.1匿名开放模式 4.2本地用户模式 4.3虚拟用户模式 五、实验总结 一、FTP协议两种工作模式 主动模式&#xff1a; 1、客户端主动向ftp服务器发送控制连接&#xff0c;三次握手控制连接…

go锁-互斥锁

go锁-互斥锁 sema初始值是0&#xff0c;waitershift等待协程的数量 正常枷锁&#xff1a; 尝试CAS直接加锁&#xff0c;通过原子包给lockerd 为枷锁 若无法直接获取&#xff0c;进行多次自旋尝试&#xff0c;未获取到的锁的g &#xff0c;多次执行空语句&#xff0c;多次尝试…

线程同步与互斥

目录 前言&#xff1a;基于多线程不安全并行抢票 一、线程互斥锁 mutex 1.1 加锁解锁处理多线程并发 1.2 如何看待锁 1.3 如何理解加锁解锁的本质 1.4 CRAII方格设计封装锁 前言&#xff1a;基于线程安全的不合理竞争资源 二、线程同步 1.1 线程同步处理抢票 1.2 如何…

《QDebug 2023年8月》

一、Qt Widgets 问题交流 1.获取 QWidget 当前所在屏幕区域 本来以为 QWidget 的 screen() 接口返回的是组件自己所在屏幕的 QSreen&#xff0c;实测是所属 Window 所在的屏幕&#xff0c;如果 Window 跨屏了两者所属屏幕可能就不是同一个。 获取 QWidget 当前所在屏幕区域可…

HTTP与SOCKS5的区别对比

在互联网世界中&#xff0c;服务器是一种重要的工具&#xff0c;可以帮助我们提高网络安全性等。今天&#xff0c;我们将重点关注两种常见的技术&#xff1a;HTTP和SOCKS5。让我们深入了解它们的工作原理、用途和优缺点&#xff0c;并通过Python代码示例学习如何使用它们。 HT…

Uniapp笔记(五)uniapp语法4

本章目标 授权登录【难点、重点】 条件编译【理解】 小程序分包【理解】 一、授权登录 我的模块其实是两个组件&#xff0c;一个是登录组件&#xff0c;一个是用户信息组件&#xff0c;根据用户的登录状态判断是否要显示那个组件 1、登录的基本布局 <template><…

QT创建可移动点类

效果如图所示&#xff1a; 创建新类MovablePoint&#xff0c;继承自QWidget. MovablePoint头文件: #ifndef MOVABLEPOINT_H #define MOVABLEPOINT_H#include <QWidget> #include <QPainter> #include <QPaintEvent> #include <QStyleOption> #includ…

2023年7月京东打印机行业品牌销售排行榜(京东运营数据分析)

鲸参谋监测的京东平台7月份打印机行业销售数据已出炉&#xff01; 7月份&#xff0c;打印机市场呈现下滑趋势。根据鲸参谋平台的数据可知&#xff0c;当月京东平台打印机的销量为48万&#xff0c;环比下降约28%&#xff0c;同比下降约18%&#xff1b;销售额为4亿&#xff0c;环…

OCR多语言识别模型构建资料收集

OCR多语言识别模型构建 构建多语言识别模型方案 合合&#xff0c;百度&#xff0c;腾讯&#xff0c;阿里这四家的不错 调研多家&#xff0c;发现有两种方案&#xff0c;但是大多数厂商都是将多语言放在一个字典里&#xff0c;构建1w~2W的字典&#xff0c;训练一个可识别多种语…

Java 8 新特性——Lambda 表达式(2)

一、Java Stream API Java Stream函数式编程接口最初在Java 8中引入&#xff0c;并且与 lambda 一起成为Java开发里程碑式的功能特性&#xff0c;它极大的方便了开放人员处理集合类数据的效率。 Java Stream就是一个数据流经的管道&#xff0c;并且在管道中对数据进行操作&…

IP初学习

1.IP报文 首部长度指的是报头长度&#xff0c;用于分离报头和有效载荷 2.网段划分 IP地址 目标网络 目标主机 3.例子 4.特殊的IP地址 5.真正的网络环境 6.调制解调器 “猫”&#xff0c;学名叫宽带无线猫 7.NAT 源IP在内网环境不断被替换 8.私有IP不能出现在公网上 因…

时序预测 | MATLAB实现CNN-BiGRU卷积双向门控循环单元时间序列预测

时序预测 | MATLAB实现CNN-BiGRU卷积双向门控循环单元时间序列预测 目录 时序预测 | MATLAB实现CNN-BiGRU卷积双向门控循环单元时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.MATLAB实现CNN-BiGRU卷积双向门控循环单元时间序列预测&#xff1b; 2.运行环境…

性能提升3-4倍!贝壳基于Flink + OceanBase的实时维表服务

作者介绍&#xff1a;肖赞&#xff0c;贝壳找房&#xff08;北京&#xff09;科技有限公司 OLAP 平台负责人&#xff0c;基础研发线大数据平台部架构师。 贝壳找房是中国最大的居住服务平台。作为居住产业数字化服务平台&#xff0c;贝壳致力于推进居住服务的产业数字化、智能…