当前位置: 首页 > news >正文

Vue学习笔记(十一)

一. Promise

1. 异步

异步:则是将耗时很长的A交付的工作交给系统之后,就去继续做B交付的工作,等到系统完成了前面的工作之后,再通过回调或者事件,继续做A剩下的工作。AB工作的完成顺序,和交付他们的时间顺序无关,所以叫“异步”。

2. 回调函数

当一个函数作为参数传入另一个函数中,并且它不会立即执行,只有当满足一定条件后该函数才可以执行,这种函数就称为回调函数。我们熟悉的定时器和Ajax中就存在有回调函数.

<script>setTimeout(() => {console.log(`执行了回调函数`)}, 3000)
</script>

这里的回调函数是() => {console.log( 执行了回调函数 )},在满足时间3秒后执行。

3. 异步函数

<script>setTimeout(() => {console.log(`执行了回调函数`)}, 3000)console.log(`111`)
</script>

如果按照代码编写的顺序,应该先输出“执行了回调函数”,再输出“111”。但实际输出为

111
执行了回调函数

这种不阻塞后面任务执行的任务就叫做异步任务。

4. 地狱回调

根据前面可以得出一个结论:存在异步任务的代码,不能保证能按照顺序执行,那如果非要代码顺序执行呢?
比如要说一句话,语序必须是下面这样的:武林要以和为贵,要讲武德,不要搞窝里斗。
必须要这样操作,才能保证顺序正确:

<script>setTimeout(() => { //第一层console.log(`武林要以和为贵`)setTimeout(() => { //第二层console.log(`要讲武德`)setTimeout(() => { //第三层console.log(`不要搞窝里斗`)}, 1000)}, 2000)}, 3000)
</script>

可以看到,代码中的回调函数套回调函数,套了3层,这种回调函数中嵌套回调函数的情况就叫做回调地狱。
当异步操作想要有顺序时,只能在一个异步成功以后的回调函数里面嵌套另一个异步的操作,如果嵌套的层数过多就形成了回调地狱
回调地狱就是为是实现代码顺序执行而出现的一种操作,它会造成我们的代码可读性非常差,后期不好维护。
那该如何解决回调地狱呢?使用Promise对象

5. 什么是Promise

Promise是ES6异步编程的一种解决方案(目前最先进的解决方案是async和await的搭配(ES8),但是它们是基于promise的),从语法上讲,Promise是一个对象或者说是构造函数,用来封装异步操作并可以获取其成功或失败的结果

6. 为什么要使用Promise

最重要也是最主要的一个场景就是ajax和axios请求。通俗来说,由于网速的不同,可能得到返回值的时间也是不同的,但是下一步要执行的代码依赖于上一次请求返回值,这个时候就需要等待,结果出来了之后才知道怎么样继续下去.

7. Promise特点

  1. Promise是一个对象,对象和函数的区别就是对象可以保存状态,函数不可以(闭包除外)
  2. Promise并未剥夺函数 return 的能力,因此无需层层传递callback,进行回调获取数据
  3. Promise代码风格,容易理解,便于维护
  4. Promise多个异步等待合并便于解决

8. 创建Promise

8.1 通过Promise构造函数

<script>//两个参数分别是resolve和reject。它们是两个函数,由JavaScript引擎提供,不用自己传参//resolve将Promise对象的状态从“未完成”变为“成功”,在异步操作成功时调用,并将异步操作的结果,作为参数传递出去//reject将Promise对象的状态从“未完成”变为“失败”, 在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去。const myPromise = new Promise((resolve, reject) => {//setTimeout模拟耗时操作(3秒后执行)setTimeout(() => {//获取随机值,范围[0,1)const random = Math.random()if (random > 0.5) {resolve(`成功`)} else {reject(`失败`)}}, 3000)})console.log(`output->myPromise`, myPromise)//then函数处理Promise的成功状态的回调函数//catch函数处理Promise的失败状态的回调函数myPromise.//res的值为resolve函数的实参值then((res) => {console.log(`output->res`, res)console.log(`output->myPromise`, myPromise)}).//err的值为reject函数的实参值catch((err) => {console.log(`output->err`, err)console.log(`output->myPromise`, myPromise)})
</script>

Promise构造函数接受一个函数作为参数,该函数的两个参数分别是resolve和reject。它们是两个函数,由JavaScript引擎提供,不用自己传值。

  1. resolve作用:将Promise对象的状态从“未完成”变为“成功”(即从 pending 变为 resolved),在异步操作成功时调用,并将异步操作的结果,作为参数传递出去;
  2. reject作用:将Promise对象的状态从“未完成”变为“失败”(即从 pending 变为 rejected),在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去。
  3. promise对象的状态不受外界影响 (3种状态):
    1. pending[待定]初始状态
    2. fulfilled[实现]操作成功
    3. rejected[被否决]操作失败
      当promise状态发生改变,就会触发then()里的响应函数处理后续步骤;promise状态一经改变,不会再变。
  4. 一旦状态改变就不会再变 (两种状态改变:成功或失败):
    1. 从pending变为fulfilled(成功)
    2. 从pending变为rejected(失败)
    3. 这两种情况只要发生,状态就凝固了,不会再变了。

获取用户信息案例:

<script>//定义getUserInfo方法const getUserInfo = (userId) => {return new Promise((resolve, reject) => {//模拟耗时操作setTimeout(() => {const random = Math.random()if (random > 0.5) {const user = { id: userId, name: 'jack', age: 30 }// 如果存在,使用resolve方法将Promise状态变为成功态resolve(user)} else {// 如果不存在,使用reject方法将Promise状态变为失败态reject('用户不存在')}}, 4000)})}//调用getUserInfo方法getUserInfo('001').//成功回调处理then((res) => {console.log(`output->获取用户成功,用户信息为:`, res)}).//失败回调处理catch((err) => {console.log(`output->err`, err)})
</script>

在该案例中,使用Promise手动管理异步操作。在getUserInfo函数中创建了一个Promise对象,将异步操作封装在其中,当异步操作执行成功时,使用resolve方法将Promise状态变为成功态,并传递用户信息,当异步操作执行失败时,使用reject方法将Promise状态变为失败态,并传递错误信息。使用then方法和catch方法分别处理Promise的状态变化,如果Promise状态变为成功态,将打印用户信息,如果Promise状态变为失败态,将打印错误信息。

8.2 通过静态方法创建Promise对象

此方式也称为Promise的自动化管理方式。比如,Promise.resolve()可以创建一个状态为成功的Promise对象,Promise.reject()可以创建一个状态为失败的Promise对象。

案例1:
<script>//Promise.resolve()和Promise.reject() 方法创建Promise对象const myPromise1 = Promise.resolve(`成功`)const myPromise2 = Promise.reject(`失败`)myPromise1.then((res) => {console.log(`output->res`, res)})myPromise2.catch((err) => {console.log(`output->err`, err)})
</script>
案例2:
<script>// 模拟一个异步操作函数const asyncFn = () => {return new Promise((resolve, reject) => {// 模拟一个异步操作,2秒钟后将结果返回setTimeout(() => {const random = Math.random()if (random > 0.5) {resolve(`success`);} else {reject(`fail`)}}, 2000)})}// 返回一个已解决的Promise对象,并使用函数返回值作为解决结果Promise.resolve(asyncFn()).then((value) => {console.log(`异步操作执行成功`, value)// 在这里处理异步操作执行成功的情况}).catch((error) => {console.log(`异步操作执行失败`, error)// 在这里处理异步操作执行失败的情况})
</script>

在这个例子中,定义了一个asyncFn函数,该函数返回一个Promise对象,在Promise对象的构造函数中使用setTimeout模拟了一个异步操作。然后我们使用Promise.resolve()方法将异步操作函数的返回值转换成一个自动管理状态的Promise对象。最后,在使用Promise.resolve()方法返回的Promise对象上使用then()方法和catch()方法处理异步操作成功或失败的情况。

使用Promise.resolve()方法的好处在于,如果被传入的参数本来就是一个Promise对象,那么直接返回这个Promise对象,如果不是Promise对象,会自动转换成Promise对象,方便在异步操作逻辑中使用。

8.3 Promise对象的链式操作

<script>// 模拟一个异步操作函数const myPromise1 =() => {return new Promise((resolve, reject) => {setTimeout(() => {const random = Math.random()if(random > 0.5) {resolve('myPromise1成功')} else {reject('myPromise1失败')}}, 2000)})}// 模拟一个异步操作函数const myPromise2 =() => {return new Promise((resolve, reject) => {setTimeout(() => {const random = Math.random()if(random > 0.5) {resolve('myPromise2成功')} else {reject('myPromise2失败')}}, 2000)})}// 模拟一个异步操作函数const myPromise3 =() => {return new Promise((resolve, reject) => {setTimeout(() => {const random = Math.random()if(random > 0.5) {resolve('myPromise3成功')} else {reject('myPromise3失败')}}, 2000)})}myPromise1().then((res1) => {console.log(`output->res1`,res1)return myPromise2()}).catch((err1) => {console.log(`output->err1`,err1)return myPromise2()}).then((res2) => {console.log(`output->res2`,res2)return myPromise3()}).catch((err2) => {console.log(`output->err2`,err2)return myPromise3()}).then((res3) => {console.log(`output->res3`,res3)}).catch((err3) => {console.log(`output->err3`,err3)})//只有一个catch,链条中所有的Promise对象有一个reject被执行,那么就直接执行最后的catch回调处理myPromise1().then((res1) => {console.log(`output->res1`,res1)return myPromise2()}).then((res2) => {console.log(`output->res2`,res2)return myPromise3()}).then((res3) => {console.log(`output->res3`,res3)}).catch((err) => {console.log(`output->err`,err)})
</script>

then()返回一个新的Promise实例,所以它可以链式调用
如果返回新的Promise,那么下一级.then()会在新的Promise状态改变之后执行

8.4 Promise中断

  1. Promise 的特性就是:不能中断
  2. 一旦执行无法知道它具体执行到哪里了,只知道在 pending,最后 resolve 或者 reject 才知道执行完毕。
  3. Promise可以通过在流程中使用 throw 来中断流程触发catch操作,也可以在某一个节点进行 reject来中断操作它的链式调用的then函数。所以在链式调用的过程中是完全可以实现中断操作的。
  4. 同步的中断Promise
<script>const someAsyncFn = () => {return new Promise(function(resolve, reject) {// 在这里写异步代码setTimeout(() => {throw new Error('强行中断,抛出异常')const random = Math.random()if (random > 0.5) {resolve('someAsyncFn异步操作成功')} else {reject('someAsyncFn异步操作失败')}}, 2000)// throw new Error("The promise was interrupted")reject(new Error("The promise was interrupted"))})}someAsyncFn().then((res)=> {console.log(res)}).catch((err) => {console.log(err)})
</script>
  1. Promise 封装异步请求,中断操作
<script>const someAsyncFn = () => {return new Promise((resolve, reject) => {setTimeout(() => {const random = Math.random();if (random > 0.5) {resolve(`someAsyncFn异步操作成功`);} else {reject(`someAsyncFn异步操作失败`);}}, 4000);});};const timeoutWrapper = (p, timeout = 2000) => {const wait = new Promise((resolve, reject) => {setTimeout(() => {reject(`请求超时`);}, timeout);});return Promise.race([p, wait]);};timeoutWrapper(someAsyncFn()).then((res) => {console.log(res);}).catch((err) => {console.log(err);});
</script>

9. Promise 常用静态方法

9.1 Promise.all() 批量执行

Promise.all([p1, p2, p3])用于将多个Promise实例,包装成一个新的Promise实例,返回的实例就是普通的Promise,它接收一个数组作为参数数组里可以是Promise对象,也可以是别的值,只有Promise会等待状态改变
当所有的子Promise都完成,该Promise完成,返回值是全部值的数组
有任何一个失败,该Promise失败,返回值是第一个失败的子Promise结果

<script>// 模拟一个异步操作函数const myPromise1 =() => {return new Promise((resolve, reject) => {setTimeout(() => {const random = Math.random()if(random > 0.5) {resolve('myPromise1成功')} else {reject('myPromise1失败')}}, 2000)})}// 模拟一个异步操作函数const myPromise2 =() => {return new Promise((resolve, reject) => {setTimeout(() => {const random = Math.random()if(random > 0.5) {resolve('myPromise2成功')} else {reject('myPromise2失败')}}, 2000)})}// 模拟一个异步操作函数const myPromise3 =() => {return new Promise((resolve, reject) => {setTimeout(() => {const random = Math.random()if(random > 0.5) {resolve('myPromise3成功')} else {reject('myPromise3失败')}}, 2000)})}Promise.all([myPromise1(), myPromise2(), myPromise3()]).then((res) => {console.log('all', res)}).catch((err) => {console.log('all', err)})
</script>

9.2 Promise.allSettled() 批量执行

用来确定一组异步操作是否都结束了(不管成功或失败),包含了”fulfilled“和”rejected“两种情况。
当有多个彼此不依赖的异步任务成功完成时,或者总是想知道每个子Promise的结果时,通常使用它。
相比之下,Promise.all() 更适合彼此相互依赖或者在其中任何一个reject时立即结束。

<script>// 模拟一个异步操作函数const myPromise1 =() => {return new Promise((resolve, reject) => {setTimeout(() => {const random = Math.random()if(random > 0.5) {resolve('myPromise1成功')} else {reject('myPromise1失败')}}, 2000)})}// 模拟一个异步操作函数const myPromise2 =() => {return new Promise((resolve, reject) => {setTimeout(() => {const random = Math.random()if(random > 0.5) {resolve('myPromise2成功')} else {reject('myPromise2失败')}}, 2000)})}// 模拟一个异步操作函数const myPromise3 =() => {return new Promise((resolve, reject) => {setTimeout(() => {const random = Math.random()if(random > 0.5) {resolve('myPromise3成功')} else {reject('myPromise3失败')}}, 2000)})}Promise.allSettled([myPromise1(), myPromise2(), myPromise3()]).then((res) => {console.log('all', res)}).catch((err) => {console.log('all', err)})</script>

对于每个结果对象,都有一个 status 字符串。如果它的值为 fulfilled,则结果对象上存在一个 value。如果值为 rejected,则存在一个 reason 。value(或 reason )反映了每个 promise 决议(或拒绝)的值。

可以发现和all相比,allSettled在其中一个Promise返回错误时还可以继续等待结果。并且不管内部的计时器定时多少毫秒,它都会等所有结果返回后按照传参传入的顺序返回Promise结果

应用场景:
比如用户在页面上面同时填了3干个独立的表单,这三个表单分三个接口提交到后端,三个接口独立,没有顺序依赖,这个时候需要等到请求全部完成后给与用户提示表单提交的情况.

面试题:
共有四个接口,第一个接口是崩溃的,但是需要返回所有接口的结果。
这一题如果使用 all,那么会直接抛出错误,所以必须使用allSettled方法请求数据

<script src="https://unpkg.com/axios/dist/axios.min.js"></script><script>let a = axios.get("http://xxxa")let b = axios.get("http://xxxb")let c = axios.get("http://xxxc")let d = axios.get("http://xxxd")Promise.allSettled([a, b, c, d]).then((res) => {console.log(res)}).catch((err) => {console.log(err)})
</script>

9.3 Promise.race() 批量执行

Promise.race()方法同样是将多个子Promise实例包装成一个新的Promise实例,但是只要有一个子Promise 实例状态发生变化,就将新的Promise实例的状态改变,且终值由第一个完成的 Promise提供。

<script>// 模拟一个异步操作函数const myPromise1 =() => {return new Promise((resolve, reject) => {setTimeout(() => {const random = Math.random()if(random > 0.5) {resolve('myPromise1成功')} else {reject('myPromise1失败')}}, 2000)})}// 模拟一个异步操作函数const myPromise2 =() => {return new Promise((resolve, reject) => {setTimeout(() => {const random = Math.random()if(random > 0.5) {resolve('myPromise2成功')} else {reject('myPromise2失败')}}, 2000)})}// 模拟一个异步操作函数const myPromise3 =() => {return new Promise((resolve, reject) => {setTimeout(() => {const random = Math.random()if(random > 0.5) {resolve('myPromise3成功')} else {reject('myPromise3失败')}}, 2000)})}Promise.race([myPromise1(), myPromise2(), myPromise3()]).then((res) => {console.log('all', res)}).catch((err) => {console.log('all', err)})
</script>

应用场景:
Promise.race()方法也有许多实际使用场景。它可以用于处理需要快速获取结果的情况,例如,当向多个不同的服务器请求同一个资源时,可以使用Promise.race()方法来获取最快返回结果的服务器的响应,并忽略其他服务器的响应结果。或者,在一个Web应用程序中,需要在指定的时间内获取用户的同步输入和异步请求结果,可以使用Promise.race()方法同时监听用户输入事件和请求结果事件,一旦其中有一个事件触发,就可以立即返回响应结果,提高应用程序的响应速度和用户体验。另外,Promise.race()方法还可以用于处理超时情况,例如,在一个HTTP请求的响应时间超过一定时间后,可以使用Promise.race()方法将该请求和一个延迟一定时间的Promise实例包装起来,一旦有一个Promise进入fulfilled状态,就可以立即返回响应结果。如果请求在规定的时间内仍未返回,则将其取消并返回一个错误信息给用户,以提高应用程序的可用性和稳定性。

9.4 Promise.any() 批量执行

Promise.any()方法会对多个Promise进行竞争,直到有一个子Promise进入Fulfilled状态,Promise实例返回该Promise的结果。如果所有Promise都进入Rejected状态,则返回失败状态,其中维护Promise及其状态的任何提示返回数组都是必需的。
Promise.any()跟Promise.race()方法很像,只有一点不同,就是Promise.any()不会因为某个Promise 变成rejected状态而结束,必须等到所有参数 Promise 变成rejected状态才会结束。

<script>// 模拟一个异步操作函数const myPromise1 =() => {return new Promise((resolve, reject) => {setTimeout(() => {const random = Math.random()if(random > 0.5) {resolve('myPromise1成功')} else {reject('myPromise1失败')}}, 2000)})}// 模拟一个异步操作函数const myPromise2 =() => {return new Promise((resolve, reject) => {setTimeout(() => {const random = Math.random()if(random > 0.5) {resolve('myPromise2成功')} else {reject('myPromise2失败')}}, 2000)})}// 模拟一个异步操作函数const myPromise3 =() => {return new Promise((resolve, reject) => {setTimeout(() => {const random = Math.random()if(random > 0.5) {resolve('myPromise3成功')} else {reject('myPromise3失败')}}, 2000)})}Promise.any([myPromise1(), myPromise2(), myPromise3()]).then((res) => {console.log('all', res)}).catch((err) => {console.log('all', err)})
</script>

使用场景:
Promise.any()方法可以用于处理多种资源竞争的情况,例如,在一个抢单系统中,多个用户需要争夺同一个订单,系统将同时向多个用户发送请求,并使用Promise.any()方法监听所有请求的状态,一旦有一个用户成功抢到订单,系统就立即返回订单信息并发送通知给该用户,从而提高了用户的参与度和系统的可用性。除此之外,Promise.any()方法还可以用于指定默认值或备选方案,例如,在一个多语言网站中,需要从多个API获取多语言翻译结果,但有些API可能由于网络原因或其他问题无法正常工作,这时候就可以使用Promise.any()方法来一次性向多个API发送请求,并设置一个默认值或备选方案,一旦有一个API正常返回翻译结果,就立即返回结果给用户,如果所有API都无法正常工作,则返回默认值或备选方案。

相关文章:

Vue学习笔记(十一)

一. Promise 1. 异步 异步&#xff1a;则是将耗时很长的A交付的工作交给系统之后&#xff0c;就去继续做B交付的工作&#xff0c;等到系统完成了前面的工作之后&#xff0c;再通过回调或者事件&#xff0c;继续做A剩下的工作。AB工作的完成顺序&#xff0c;和交付他们的时间顺…...

ABAP进阶学习1:动态内表1-通过系统表LVC_T_FCAT类型定义内表

动态内表1-通过系统表LVC_T_FCAT类型定义内表 如果对你有帮助&#xff0c;点个关注收藏吧~ 做BW做久了&#xff0c;突然对abap有了探索欲&#xff0c;开始进一步学习abap了&#xff0c;以后这个系列会逐步更新&#xff0c;欢迎小伙伴点个关注一起学习&#xff0c;我学习的方法…...

【Vispy库】一个用于高性能交互式2D/3D数据可视化库 Python库

Vispy库 1、你好&#xff0c;Vispy&#xff01;2、安装Vispy&#xff0c;轻松上手3、案例一&#xff1a;绘制简单的2D图形4、案例二&#xff1a;3D图形的绘制5、案例三&#xff1a;大规模数据的可视化6、结语 1、你好&#xff0c;Vispy&#xff01; Vispy是一个用于Python的高…...

为什么 C 语言数组是从 0 开始计数的?

C 语言等大多数编程语言的数组从 0 开始而不从 1 开始&#xff0c;有两个原因&#xff1a; 第一&#xff1a;地址计算更方便 C 语言从 0 开始的话&#xff0c;array[i] 的地址就正好是&#xff1a; (array i) 如果是从 1 开始的话&#xff0c;就是 (array i - 1) 多一次计…...

matlab线性度计算程序

matlab线性度计算程序 环境 matlab2023a ads2020 原理 其中f(v)是曲线&#xff0c;fmax是f(v)的最大值&#xff0c;fmin是f(v)的最小值&#xff0c;vmax为fmax对应v值&#xff0c;vmin为fmin对应v值。 L∆fmax/(fmax-fmin) (1) ∆fmaxmax⁡[f(v)-[fmin-K*(v-vmin)]] (2) K(…...

为什么NMOS管比PMOS管更受欢迎?

NMOS在实际应用中为何比PMOS要更受欢迎。本文将从导电沟道、电子迁移率和器件速度等多个方面来展开讲解。 首先是在性能方面考虑&#xff1a; 与NMOS管驱动能力相同的一个PMOS管&#xff0c;其器件面积可能是NMOS管的2&#xff5e;3倍&#xff0c;然而器件面积会影响导通电阻…...

【论文复现】短期电力负荷

作者主页&#xff1a; 七七的个人主页 文章收录专栏&#xff1a; 论文复现 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01;&#x1f496;&#x1f496; 短期电力负荷 论文发表问题背景一. 基本问题二. 本论文发现的问题 对于论文发现问题的解决方案&#xff1a;复现…...

pytest脚本常用的执行命令

pytest脚本常用的执行命令 一、一般执行的脚本&#xff0c;执行.py文件整个脚本二、执行.py文件脚本中的一个模块三、执行脚本&#xff0c;执行.py文件整个脚本&#xff0c;或则一个模块&#xff0c;查看对应的日志信息3.1.py文件执行allure的脚本3.2去dos框下去执行对应的脚本…...

OpenCv入门

一.OpenCv简介 1 图像的起源 1.1图像是什么&#xff1f; 图&#xff1a;是物体反射或透射光的分布 像&#xff1a;是人的视觉系统所接受的图在人脑中所形版的印象或认识 1.2模拟图像和数字图像 模拟图像&#xff1a;连续存储的图像 数字图像&#xff1a;分级存储的图像 2 数字…...

超详细的flex教程(面试必考)

引言 为什么存在&#xff1f; Flex 布局的出现是为了解决传统 CSS 布局方式&#xff08;如浮动布局、定位布局等&#xff09;在处理复杂布局时的诸多限制和不便。 优势 1. 简化布局 Flex 布局的语法简洁明了&#xff0c;代码更易读。 2. 强大的对齐能力 提供丰富的对齐属…...

C++的输入与输出

一.格式和注意要点 1. #include<iostream>; using namespace std; 标准库定义了4个IO对象&#xff0c;IO(输入输出)&#xff0c;以下&#xff1a; cin是一个istream流对象&#xff0c;现在理解为标准输入即可。cout是一个ostream流对象&#xff0c;理解为标准输出即可。…...

上海剧某文化传播有限公司与喜某(上海)网络科技有限公司、上海喜某科技有限公司侵害著作权及不正当竞争纠纷案

上海剧某文化传播有限公司与喜某&#xff08;上海&#xff09;网络科技有限公司、上海喜某科技有限公司侵害著作权及不正当竞争纠纷案的详细情况如下&#xff1a; 基本案情&#xff1a; 上海剧某文化传播有限公司&#xff08;以下简称剧某公司&#xff09;是电视剧《宸汐缘》的…...

【c++篇】:模拟实现string类--探索字符串操作的底层逻辑

✨感谢您阅读本篇文章&#xff0c;文章内容是个人学习笔记的整理&#xff0c;如果哪里有误的话还请您指正噢✨ ✨ 个人主页&#xff1a;余辉zmh–CSDN博客 ✨文章所属专栏&#xff1a;c篇–CSDN博客 文章目录 前言一.string类的默认成员函数以及深拷贝1.基本框架2.默认成员函数…...

springboot配置logback.xml遇到的几个问题

最近项目用到对日志脱敏&#xff0c;经过研究通过logback实现了对日志脱敏&#xff0c;上篇文章中详细讲解了如果配置。但是还是对logback的配置不太了解。比如springboot怎么加载这个logback.xml的。 首先&#xff0c;默认情况下&#xff0c;logback.xml文件是放在类目录下&am…...

MySQL 5.7与MySQL 8.0对比

一、功能对比 JSON支持 MySQL 5.7&#xff1a;引入了JSON数据类型&#xff0c;允许用户存储和操作JSON格式的数据&#xff0c;这是NoSQL功能的一个重要补充。但相对于MySQL 8.0&#xff0c;其功能和性能较弱。MySQL 8.0&#xff1a;在JSON支持方面进行了重大改进&#xff0c;引…...

【代码随想录Day55】图论Part07

prim 算法精讲 题目链接/文章讲解&#xff1a;代码随想录 import java.util.*;public class Main {public static void main(String[] args) {Scanner scanner new Scanner(System.in);// 读取顶点数和边数int vertexCount scanner.nextInt();int edgeCount scanner.nextI…...

软考在即!这些注意事项你提前了解!

11月软考马上就要开始了&#xff0c;但是&#xff0c;还有很多的考生&#xff0c;可能还不知道自己到底应该去了解些什么&#xff1f;本文将详细介绍机考注意事项及系统操作提示&#xff0c;帮助考生们备考无忧。 一、考试入场要求和考场规则 1、入场时间&#xff1a;考生需提…...

CMake知识点

参考&#xff1a; https://zhuanlan.zhihu.com/p/661284252 cmake使用教程&#xff08;实操版&#xff09;-CSDN博客 【CMake】CMake从入门到实战系列&#xff08;二&#xff09;——实例入手&#xff0c;讲解CMake的基本流程_cmake创建一个可执行目标的过程-CSDN博客 一、…...

git ls-remote

文章目录 1.简介2.格式3.选项4.示例5.小结参考文献 1.简介 git ls-remote 是一个 Git 命令&#xff0c;用于列出远程 Git 仓库的引用&#xff08;refs&#xff09;&#xff0c;包括分支、标签等。 这个命令非常有用&#xff0c;可以帮助你查看远程仓库中可用的分支和标签&…...

低代码平台如何通过AI赋能,实现更智能的业务自动化?

引言 随着数字化转型的加速推进&#xff0c;企业在日常运营中面临的业务复杂性与日俱增。如何快速响应市场需求&#xff0c;优化流程&#xff0c;并降低开发成本&#xff0c;成为各行业共同关注的核心问题。低代码平台作为一种能够快速构建应用程序的工具&#xff0c;因其可视化…...

计算疫情扩散时间

该专栏题目包含两部分&#xff1a; 100 分值部分题目 200 分值部分题目 所有题目都会陆续更新&#xff0c;订阅防丢失 题目描述 在一个地图中(地图由 N ∗ N N*N N∗N 个区域组成)&#xff0c;有部分区域被感染病菌。 感染区域每天都会把周围(上下左右)的4个区域感染。 请…...

【Windows11】24H2 内存占用高(截至10月31日)

文章目录 一、问题二、解决三、原因 一、问题 系统版本&#xff1a; 内存只有32GB。 以前只有我在运行数据处理程序的时候内存占用才会很高&#xff0c;日常情况下应该只有40%、50%左右的。 但是24H2&#xff0c;日常情况下内存占用80%以上。 而我只开了很少的应用&#…...

题目:多个字符从两端移动,向中间汇聚

【多个字符从两端移动&#xff0c;向中间汇聚】 char arr1[] "Good Good Study,Day Day Up!" ; char arr2[] "***************************"; 【思路】 首先两字符串中的元素个数要相同&#xff0c;将两串字符分别存放在数组中&#xff0c;那么字符串中…...

前端如何安全存储密钥,防止信息泄露

场景 把公钥硬编码在前端代码文件里&#xff0c;被公司安全检测到了要整改&#xff0c;于是整理几种常见的前端密钥存储方案。 1. 设置环境变量再读取 在打包或部署前端应用时&#xff0c;可以将密钥配置为环境变量&#xff0c;在应用运行时通过环境变量读取密钥。这样可以将密…...

银行电子户分账解决电商行业哪些问题

随着电子商务的快速发展&#xff0c;电商银行电子户分账作为金融科技领域的重要一环&#xff0c;逐渐成为现代金融业务的核心。本文将详细探讨电商银行电子户分账的原理、操作流程、安全措施以及在电子商务中的重要作用。 二、电商银行电子户分账的基本概念 电商银行电子户分…...

Web音乐库:SpringBoot实现的音乐网站

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…...

Rust: 加密算法库 ring 如何用于 RSA 数字签名?

本来用 rsa 库基本搞定&#xff0c;但文心一言建议改用 ring 库。原因是 rsa 库已经放弃维护&#xff0c;而 ring 库性能公认很好。但是如何进行 RSA 数字签名&#xff0c;网上几乎查不到这方面材料。仔细查看了 ring 库的源代码和代码注释&#xff0c;终于完成趟坑。总结一下供…...

Matplotlib 网格线

Matplotlib 网格线 Matplotlib 是一个强大的 Python 绘图库&#xff0c;广泛用于数据可视化。在 Matplotlib 中&#xff0c;网格线是一种常用的辅助工具&#xff0c;用于增强图表的可读性和美观性。本文将详细介绍如何在 Matplotlib 中添加和使用网格线。 1. 简介 网格线是在…...

钉钉机器人禅道消息通知@指派人

钉钉、禅道怎么设置webhook&#xff1f; 点击查看&#xff1a;获取自定义机器人 Webhook 地址 在禅道上配置钉钉机器人webhook&#xff0c;使用管理员账号登录&#xff0c;找到通知设置 添加webhook 添加webhook所需要的数据即可 webhook设置&#xff0c;根据自己的实际…...

我的新书出版啦!和大家聊聊写书的酸甜苦辣

我的新书出版啦&#xff01;小伙伴们问是不是赚翻了&#xff1f; 大家好&#xff0c;我是码哥。我的新书《Redis 高手心法》出版后&#xff08;2024 年 8 月份出版&#xff09;&#xff0c;有一些小伙伴问了我一些问题&#xff1a; 写书是不是赚了很多钱&#xff1f;我也想写…...