异步操作、Promise和axios

1.Javascript是单线程的

什么是进程,什么是线程?

进程:进程是操作系统分配资源和调度的基本单位。它是一个程序的实例,包含了运行程序所需的代码和数据以及其它资源。

线程:线程是进程中的实际运行单位,也是操作系统分配CPU时间的基本单位。一个进程可以包含一个或多个线程

以浏览器举例,一个浏览器的tab,他就是一个独立的进程,而在这个进程里面跑着各种各样的线程,比如专门负责渲染网页的线程,专门用来跑javascript的线程,

而在这其中 javascript的线程,是单线程,单线程的意思是:也即在同一时间,只会有一个js任务在执行。

如果同一时间,有多个js进程在执行,那么如果他们同时操作了dom,以谁为准???当然还会带来更多的问题,所以,javascript只能是单线程的

// 模拟一个耗时操作function longRunningTask() {console.log("开始执行耗时任务...");const start = Date.now();while (Date.now() - start < 1000) {// 模拟耗时5秒的同步操作}console.log("耗时任务结束");}// 主代码console.log("脚本开始");longRunningTask(); // 调用同步任务,阻塞线程console.log("脚本结束");
  1. 将这段代码放在body下面
  2. 将这段代码放在head中

2.异步操作(异步编程)、同步操作

异步操作是指在编程中,某个任务的执行不会立即完成同时不会阻塞后续代码的执行。在异步操作中,程序可以继续运行,并在异步任务完成时得到通知并处理结果。这与同步操作相对,同步操作会阻塞程序的继续执行直到任务完成。

2.1 异步解决的问题

如果没有异步,那么你每请求一个接口,页面都将不能被滑动,呈现出来就是一卡一卡的

3.回调函数

回调函数是最基本的异步处理方式。在异步操作完成后,调用预先传入的函数

// 示例:使用回调函数进行异步操作
function fetchData(callback) {setTimeout(() => {const data = "Hello, World!";callback(data);}, 1000);
}fetchData((data) => {console.log(data);  // 1秒后输出 "Hello, World!"
});

问题:会带来回调地狱

解决的问题:回调地狱

没有promise的时候,都会采用回调函数的方案来进行异步操作

也就是多个回调放一起嵌套起来

// getUserInfo -> getConnectList -> getOneManConnect()
getUserInfo((res) => {getConnectList(res.user_id,(list) => {getOneManConnect(list.one_man_id,(message) => {console.log('这是我和某位用户的聊天记录');},(msg_err) => {console.log('获取详情失败');});},(list_err) => {console.log('获取列表失败');});},(user_err) => {console.log('获取用户个人信息失败');}
);
// 用promise来写:
getUserInfo().then(res => getConnectList(res.user_id)).then(list => getOneManConnect(list)).then(message => console.log(message)).catch(error => console.log(error));

4.Promise

Promise 是 JavaScript es6 的一个特性,它允许你在异步操作(如网络请求)完成后执行某些代码。它代表了一个将来才会知道结果的操作。Promise 可以处于以下三种状态之一:

  • Pending(进行中):初始状态,既没有成功,也没有失败。
  • Fulfilled(已成功):操作成功完成。
  • Rejected(已失败):操作失败。

1.1用法

  1. 创建promise
let promise = new Promise((resolve, reject) => {// 异步操作if (/* 操作成功 */) {resolve(value); // 成功时调用} else {reject(error); // 失败时调用}
});
  1. 使用 Promise
  • then():接收两个函数作为参数,第一个函数在 Promise 成功时调用,第二个在失败时调用。
promise.then(value => { /* 成功时的处理 */ },error => { /* 失败时的处理 */ }
);
  • catch():用于捕获 Promise 中发生的错误。
promise.catch(error => { /* 错误处理 */ }
);
  • finally():无论 Promise 最终状态如何都会执行。
promise.finally(() => {// 总是会执行的代码
});
  1. 链式调用:可以将多个 .then().catch() 串联起来,形成链式调用。
  2. 静态方法
  • Promise.all():等待所有的 Promise 完成。
  • Promise.race():返回最先改变状态的 Promise 的结果。
  • Promise.resolve()Promise.reject():快速创建已解决或已拒绝的 Promise。

1.2 图示

5.模拟后端请求的方法:

// 定义一个方法,这个方法里返回一个promise对象
// 使用setTimeout模拟异步操作
// 2秒后返回一个字符串Data
const getData = () =>new Promise((resolve) => {setTimeout(() => {resolve("Data");}, 2000);});// 当然,也可以返回一个错误
const getError = () =>new Promise((resolve, reject) => {setTimeout(() => {reject("Error");}, 2000);});
// 当然也可以通过传入的值判断,返回的是成功还是失败
const get = (value) => {return new Promise((resolve, reject) => {setTimeout(() => {if (value) {resolve("Data");} else {reject("Error");}}, 2000);});
};

小练习

逻辑:现在有一个商品列表,但是请求商品列表需要一个id,来指定请求的是哪个商品列表,这个id需要请求另一个接口才能拿到。

任务:

  1. 创建一个请求id的函数,该函数返回一个promise,该promise在2秒后解决(成功),返回一个数字(也即指定商品列表的id)(提示:2秒后成功解决,请用setTimeout来模拟)
  2. 创建一个请求商品列表的函数,该函数接受一个id,该promise在3秒后解决(成功),返回一个商品列表,商品列表的数据如下
const data = {code:0,data:[{ goodsName: '袜子', price: 20 },{ goodsName: 'T恤', price: 25 },{ goodsName: '牛仔裤', price: 50 },{ goodsName: '连衣裙', price: 70 },{ goodsName: '运动鞋', price: 80 },{ goodsName: '夹克', price: 120 },{ goodsName: '帽子', price: 15 },{ goodsName: '围巾', price: 30 },{ goodsName: '手套', price: 18 },{ goodsName: '裙子', price: 60 },{ goodsName: '卫衣', price: 90 },
],
}

     3.先调用请求id的函数,返回结果后,再通过.then链式调用请求商品列表的函数,最终打印出商品列表

代码示例:

<template>
</template><script setup>
import { ref } from 'vue';
const data = ref('[]')
const getid = () => {return new Promise((resolve, project) => {setTimeout(() => {resolve(2)}, 3000)})
};const getlist = () => {return new Promise((resolve, reject) => {setTimeout(() => {resolve([{code: 0,data: [{ goodsName: '袜子', price: 20 },{ goodsName: 'T恤', price: 25 },{ goodsName: '牛仔裤', price: 50 },{ goodsName: '连衣裙', price: 70 },{ goodsName: '运动鞋', price: 80 },{ goodsName: '夹克', price: 120 },{ goodsName: '帽子', price: 15 },{ goodsName: '围巾', price: 30 },{ goodsName: '手套', price: 18 },{ goodsName: '裙子', price: 60 },{ goodsName: '卫衣', price: 90 },]}]);}, 3000);});
};
//开始使用getid()函数
getid().then((id) => {console.log('成功2' + '+', id);return getlist();
}).then((res) => {const data = res[0]console.log('成功3' + JSON.stringify(data));
})
</script><style scoped></style>

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python基础:(八)文件

目录 一.从文件中读取数据1.1读取整个文件1.2文件路劲1.3逐行读取 二.写入文件 一.从文件中读取数据 各位小伙伴&#xff0c;文件这一块得好好学&#xff0c;多看多敲代码&#xff0c;以后处理数据&#xff0c;写爬虫少不了这个&#xff0c;先从基础&#xff08;简单的&#x…

基于视觉的3D占用网络汇总

综述文章:https://arxiv.org/pdf/2405.02595 基于视觉的3D占用预测方法的时间线概述: 自动驾驶中基于视觉的3D占用预测的分层结构分类 2023年的方法: TPVFormer, OccDepth, SimpleOccupancy, StereoScene, OccupancyM3D, VoxFormer, OccFormer, OVO, UniOcc, MiLO, Multi-…

IDEA创建Spring Boot项目配置阿里云Spring Initializr Server URL【详细教程-轻松学会】

1.首先打开idea选择新建项目 2.选择Spring Boot框架(就是选择Spring Initializr这个) 3.点击中间界面Server URL后面的三个点更换为阿里云的Server URL Idea中默认的Server URL地址&#xff1a;https://start.spring.io/ 修改为阿里云Server URL地址&#xff1a;https://star…

2024-12-06 Unity Addressables3——资源加载

文章目录 1 引用加载1.1 Addressables 的资源引用类1.2 加载资源1.3 加载场景1.4 释放资源 2 Label 介绍3 动态加载3.1 加载单个资源3.2 加载多个资源 Unity 版本&#xff1a;6000.0.26f1c1Addressables 版本&#xff1a;2.3.1 1 引用加载 1.1 Addressables 的资源引用类 Ass…

详解RabbitMQ在Ubuntu上的安装

​​​​​​​ 目录 Ubuntu 环境安装 安装Erlang 查看Erlang版本 退出命令 ​编辑安装RabbitMQ 确认安装结果 安装RabbitMQ管理界面 启动服务 查看服务状态 通过IP:port访问 添加管理员用户 给用户添加权限 再次访问 Ubuntu 环境安装 安装Erlang RabbitMq需要…

`yarn list --pattern element-ui` 是一个 Yarn 命令,用于列出项目中符合指定模式(`element-ui`)的依赖包信息

文章目录 命令解析&#xff1a;功能说明&#xff1a;示例输出&#xff1a;使用场景&#xff1a; yarn list --pattern element-ui 是一个 Yarn 命令&#xff0c;用于列出项目中符合指定模式&#xff08; element-ui&#xff09;的依赖包信息。 命令解析&#xff1a; yarn list…

IO进程 学习笔记

……接上文 fputs&#xff08;输入字符串&#xff09; int fputs(const char *s, FILE *stream);功能&#xff1a;向指定文件中输入一串字符参数&#xff1a;s:输入字符串的首地址stream&#xff1a;文件流指针返回值&#xff1a;成功返回输出字符个数失败返回EOF文件指针偏移函…

Ubuntu压缩打包解压

ubuntu压缩打包 上图&#xff0c;压缩当前目录svn 为svn.tar.gaz&#xff0c;解压后再当前解压目录生成svn文件 在Ubuntu中&#xff0c;你可以使用tar命令来创建一个压缩包&#xff0c;或者使用zip命令来创建一个.zip压缩文件。以下是两种常见的压缩方法&#xff1a; 下图&am…

支付宝租赁小程序助力便捷生活新方式

内容概要 支付宝租赁小程序为现代人带来了许多惊喜&#xff0c;它不仅仅是一个简单的租赁平台&#xff0c;更是生活中不可或缺的好帮手。想象一下&#xff0c;无论你缺少什么&#xff0c;从工具到家居用品&#xff0c;只需轻轻一点&#xff0c;便能轻松找到需要的物品。这个小…

springboot413福泰轴承股份有限公司进销存系统(论文+源码)_kaic

摘 要 使用旧方法对福泰轴承股份有限公司进销存系统的信息进行系统化管理已经不再让人们信赖了&#xff0c;把现在的网络信息技术运用在福泰轴承股份有限公司进销存系统的管理上面可以解决许多信息管理上面的难题&#xff0c;比如处理数据时间很长&#xff0c;数据存在错误不…

y3编辑器文档3:物体编辑器

文章目录 一、物体编辑器简介1.1 界面介绍1.2 复用(导入导出)1.3 收藏夹(项目资源管理)1.4 对象池二、单位2.1 数据设置2.2 表现设置2.3 单位势力和掉率设置2.4 技能添加和技能参数修改2.5 商店2.5.1 商店属性设置2.5.2 商店物品设置三、装饰物3.1 属性编辑3.2 碰撞体积四、…

C++作业3(类)

1、思维导图 2、类中存在引用成员情况下有参构造 #include <iostream>using namespace std; class Cy {float &r; public:Cy(float &r):r(r){cout<<"类中存在引用成员情况下有参构造"<<endl;};float set_r(float);void show(); }; float…

【开源】一款基于SpringBoot 的全开源充电桩平台

一、下载项目文件 下载源码项目文件口令&#xff1a;动作璆璜量子屏多好/~d1b8356ox2~:/复制口令后&#xff0c;进入夸克网盘app即可保存&#xff08;如果复制到夸克app没有跳转资源&#xff0c;可以复制粘贴口令到夸克app的搜索框也可以打开&#xff08;不用点搜索按钮&#…

定制链接类名,两类跳转传参,vue路由重定向,404,模式设置

router-link-exact-active 和 router -link-active两个类名都太长&#xff0c;可以在router路由对象中定制进行简化 // index.js// 路由的使用步骤 52 // 1.下载 v3.6.5 // 2.引入 // 3.安装注册Vue.use(Vue插件) // 4.创建路由对象 // 5.注入到new Vue中&#xff0c;建立关联…

鼠标右键单击Git Bash here不可用

最近在学习git时突然发现右键的git bash没反应&#xff0c;但是去点击应用图标就能正常运行&#xff0c;通常是因为你在安装git之后改变了它的目录名称或者位置&#xff0c;我就是因为安装后改变了一个文件夹的文件名导致不可用 在安装git时系统会默认给鼠标右键选项的git Bas…

探索Web3:从去中心化应用到全球数字化未来

Web3 是互联网发展的下一步&#xff0c;它通过去中心化的理念重新定义了数字世界。与传统的Web2相比&#xff0c;Web3将数据主权交还给用户&#xff0c;让每个人都可以在没有中介的情况下安全地交换信息和价值。本文将探索Web3的基本概念&#xff0c;去中心化应用&#xff08;D…

给我的小程序加了个丝滑的搜索功能,踩坑表情包长度问题

前言 最近在用自己的卡盒小程序的时候&#xff0c;发现卡片越来越多&#xff0c;有时候要找到某一张来看看笔记要找半天&#xff0c;于是自己做了一个搜索功能&#xff0c;先看效果&#xff1a; 怎么样&#xff0c;是不是还挺不错的&#xff0c;那么这篇文章就讲讲这样一个搜索…

HarmonyOS 线性容器List 常用的几个方法

List底层通过单向链表实现&#xff0c;每个节点有一个指向后一个元素的引用。当需要查询元素时&#xff0c;必须从头遍历&#xff0c;插入、删除效率高&#xff0c;查询效率低。List允许元素为null。 List和LinkedList相比&#xff0c;LinkedList是双向链表&#xff0c;可以快速…

华为HarmonyOS NEXT 原生应用开发:页面路由、页面和组件生命周期函数

页面路由、组件生命周期 一、路由的基本使用 1. 如何新建页面 直接右键新建Page。【这个是最直接最常用的】新建普通ets文件&#xff0c;然后通过配置变成页面。 【该方法是遇到这种情况的解决方案】 2. 路由 - 页面之间的跳转 使用 **router.pushUrl&#xff08;{}&#xff…

二叉树概述

目录 一、二叉树的基本结构 二、二叉树的遍历 1.前序 2.中序 3.后序 4.层序遍历 三.计算二叉树的相关参数 1.计算节点总个数 2.计算叶子节点的个数 3.计算树的高度 4.计算第k层的子树个数 5.查找树中val为x的节点 四.刷题 1.单值二叉树 2.检查两棵树是否相同 3.一…