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

前端工程化18-邂逅Promise(待更新)

6、邂逅Promise

6.1、函数对象与实例对象

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>准备_函数对象与实例对象</title>
</head>
<body><script>/* 函数对象、实例对象1.函数对象: 将函数作为对象使用时, 简称为函数对象。2.实例对象: new 构造函数或类产生的对象, 我们称之为实例对象。*///函数对象function Person (name,age){this.name = namethis.age = age}Person.a = 1 //将Person看成一个对象//一个小的面试点Person.name="英叔"	console.log(Person.name); //输出结果为Person 而不是林正英const p1 = new Person('老刘',18) //p1是Person的实例对象console.log(p1);</script>
</body>
</html>

6.2、回调函数的分类

要区分那些函数进浏览器回调队列那些不进

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>准备_回调函数的分类</title>
</head>
<body><script>/* 前序知识:什么是回调?---我们定义的,我们没有调用,最终执行了。1.同步的回调函数: 理解: 立即在主线程上执行, 不会放入回调队列中。例子: 数组遍历相关的回调函数 2.异步的回调函数: 理解: 不会立即执行, 会放入回调队列中以后执行例子: 定时器回调 / ajax回调 *///演示同步的回调函数/* let arr = [1,3,5,7,9]arr.forEach((item)=>{console.log(item);})console.log('主线程的代码'); *///演示异步的回调函数/* setTimeout(()=>{console.log('@');},2000)console.log('主线程'); */</script>
</body>
</html>

6.3、JavaScript中的error

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>准备_js中的error</title>
</head>
<body><script>/* 进一步理解JS中的错误(Error)和错误处理mdn文档: https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Error1. 错误的类型Error: 所有错误的父类型ReferenceError: 引用的变量不存在TypeError: 数据类型不正确RangeError: 数据值不在其所允许的范围内--死循环SyntaxError: 语法错误2. 错误处理捕获错误: try{}catch(){}抛出错误: throw error3. 错误对象message属性: 错误相关信息stack属性: 记录信息*///演示:ReferenceError: 引用的变量不存在/* console.log(a); *///演示:TypeError: 数据类型不正确/* const demo = ()=>{}demo()() *///演示:RangeError: 数据值不在其所允许的范围内/* const demo = ()=>{demo()}demo() *///演示:SyntaxError: 语法错误/* console.log(1; *///如何捕获一个错误//try中放可能出现错误的代码,一旦出现错误立即停止try中代码的执行,调用catch,并携带错误信息/* try {console.log(1);console.log(a);console.log(2);} catch (error) {console.log('代码执行出错了,错误的原因是:',error);} *///如何抛出一个错误function demo(){const date = Date.now()if(date % 2 === 0){console.log('偶数,可以正常工作');}else{throw new Error('奇数,不可以工作!')}}try {demo()} catch (error) {debugger;console.log('@',error);}
</script>
</body>
</html>

6.4、初识Promise

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>初识Promise</title>
</head>
<body><!-- Promise是什么?1.抽象表达:(1).Promise是一门新的技术(ES6提出的)(2).Promise是JS中异步编程的新方案(旧方案是谁?---纯回调)2.具体表达:(1).从语法上来说: Promise是一个内置构造函数(2).从功能上来说: Promise的实例对象可以用来封装一个异步操作,并可以获取其成功/失败的值-->
<script type="text/javascript">/* 1.Promise不是回调,是一个内置的构造函数,是程序员自己new调用的。2.new Promise的时候,要传入一个回调函数,它是同步的回调,会立即在主线程上执行,它被称为executor函数3.每一个Promise实例都有3种状态:初始化(pending)、成功(fulfilled)、失败(rejected)4.每一个Promise实例在刚被new出来的那一刻,状态都是初始化(pending)5.executor函数会接收到2个参数,它们都是函数,分别用形参:resolve、reject接收1.调用resolve函数会:(1).让Promise实例状态变为成功(fulfilled)(2).可以指定成功的value。2.调用reject函数会:(1).让Promise实例状态变为失败(rejected)(2).可以指定失败的reason。*///创建一个Promise实例对象const p = new Promise((resolve, reject)=>{reject('ok')})console.log('@',p); //一般不把Promise实例做控制台输出</script>
</body>
</html>

主要记忆

executor函数,是一个同步回调函数

三种状态 初始化、成功、失败

两个函数 resolve(value) 成功 reject(value)失败 value可以指定生工或失败内容

6.5、Promise基本使用

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Promise基本使用</title>
</head>
<body><!-- 1. 重要语法new Promise(executor)构造函数Promise.prototype.then方法2. 基本编码流程1.创建Promise的实例对象(pending状态), 传入executor函数2.在executor中启动异步任务(定时器、ajax请求)3.根据异步任务的结果,做不同处理:3.1 如果异步任务成功了:我们调用resolve(value), 让Promise实例对象状态变为成功(fulfilled),同时指定成功的value3.2 如果异步任务失败了:我们调用reject(reason), 让Promise实例对象状态变为失败(rejected),同时指定失败的reason4.通过then方法为Promise的实例指定成功、失败的回调函数,来获取成功的value、失败的reason注意:then方法所指定的:成功的回调、失败的回调,都是异步的回调。3. 关于状态的注意点:1.三个状态:pending: 未确定的------初始状态fulfilled: 成功的------调用resolve()后的状态rejected: 失败的-------调用reject()后的状态2.两种状态改变pending ==> fulfilledpending ==> rejected3.状态只能改变一次!!4.一个promise指定多个成功/失败回调函数, 都会调用吗?多个then 或者catch方法,都会接收到异步任务的结果,按照顺序来--><script type="text/javascript" >const p = new Promise((resolve,reject)=>{//模拟一个异步任务/* setTimeout(()=>{resolve('我是成功的数据')},2000) *///真正开启一个异步任务const xhr = new XMLHttpRequest()xhr.onreadystatechange = ()=>{if(xhr.readyState === 4){//readyState为4代表接收完毕,接收的可能是:服务器返回的成功数据、服务器返回的错误if(xhr.status === 200) resolve(xhr.response)else reject('请求出错')}}xhr.open('GET','https://api.apiopen.top/getJoke')xhr.responseType = 'json'xhr.send()})p.then((value)=>{console.log('成功了1',value);}, //成功的回调-异步(reason)=>{console.log('失败了1',reason);} //失败的回调-异步)console.log('@');</script>
</body>
</html>

6.6、封装一个简单的ajax

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>封装一个简单的ajax</title>
</head>
<body>
<script type="text/javascript">/*定义一个sendAjax函数,对xhr的get请求进行封装:1.该函数接收两个参数:url(请求地址)、data(参数对象)2.该函数返回一个Promise实例(1).若ajax请求成功,则Promise实例成功,成功的value是返回的数据。(2).若ajax请求失败,则Promise实例失败,失败的reason是错误提示。*/function sendAjax(url,data){return new Promise((resolve,reject)=>{//实例xhrconst xhr = new XMLHttpRequest()//绑定监听xhr.onreadystatechange = ()=>{if(xhr.readyState === 4){if(xhr.status >= 200 && xhr.status < 300) resolve(xhr.response);else reject('请求出了点问题');}}//整理参数let str = ''for (let key in data){str += `${key}=${data[key]}&`}str = str.slice(0,-1)xhr.open('GET',url+'?'+str)xhr.responseType = 'json'xhr.send()})}const x = sendAjax('https://api.apiopen.top/getJoke',{page:1,count:2,type:'video'})x.then((data)=>{console.log('成功了',data);},(reason)=>{console.log('失败了',reason);})</script>
</body>
</html>

6.7、纯回调的方式封装ajax

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>封装一个简单的ajax(纯回调)</title>
</head>
<body>
<script type="text/javascript">/*定义一个sendAjax函数,对xhr的get请求进行封装:1.该函数接收4个参数:url(请求地址)、data(参数对象)、success(成功的回调)、error(失败的回调)*/function sendAjax(url,data,success,error){//实例xhrconst xhr = new XMLHttpRequest()//绑定监听xhr.onreadystatechange = ()=>{if(xhr.readyState === 4){//响应了消息,至于是骂你的还是夸你的就得用status来判断了if(xhr.status >= 200 && xhr.status < 300) success(xhr.response);else error('请求出了点问题');}}//整理参数let str = ''for (let key in data){str += `${key}=${data[key]}&`}str = str.slice(0,-1)xhr.open('GET',url+'?'+str)xhr.responseType = 'json'xhr.send()}sendAjax('https://api.apiopen.top/getJoke',{page:1,count:2,type:'video'},response =>{console.log('第1次成功了',response);sendAjax('https://api.apiopen.top/getJoke',{page:1,count:2,type:'video'},response =>{console.log('第2次成功了',response);sendAjax('https://api.apiopen.top/getJoke',{page:1,count:2,type:'video'},response =>{console.log('第3次成功了',response);}, err =>{console.log('第3次失败了',err);})}, err =>{console.log('第2次失败了',err);})}, err =>{console.log('第1次失败了',err);})
</script>
</body>
</html>

肉眼可见采用纯回调会发生回调地狱的问题,尽管在Jquery1.5以后实现了PromiseA+规范,但是由于新兴起的axios非常好用,也就不在考虑使用Jquery的Ajax

6.7、常见的包管理器对比

cnpm yarn npm pnpm

cnpm阿里出品,这个东西我们一般是用他的国内镜像。这个东西有一个很大的缺点,cnpm安装的东西他有一个缺点,他会给他建立一个快捷方式,随这你安装更多的包,他的快捷方式会越来越大,这都是不是主要的,问题是他在卸载某个包的时候他会把你安装的所有包都给卸载掉,他又三种卸载包的命令,都存在这种问题。他也没有打算处理。所以不要用它

测试npm、初始化一个项目,包名能起跟主流库一样的名字嘛,不能!那冲突能咋的呀?也不报错啊,有一严重的问题,你自己初始化的包名叫做jquery的时候,就导致你下载不下来真正的Jquery这个库,你本身就是jquery,还怎么下载jquery,但是yarn就没有这个问题 yarn add,yarn的算法比较优秀,他的缓存文件做也不错。用yarn还是比较不错的。下载速度也比较快,目前我电脑上是这么使用包管理器的 yarn的命令,因为yarn他对包的索引啊,遍历啊对比啊,他的速度非常快,用yarn的命令,用cnpm的仓库地址,这俩人配合起来安装包是特别快的,但是个别时候,如果说由于网络状况导致yarn可能不好用,那我顶多用下npm,cnpm那基本上是不会用的

6.8、复习

Ajax跨域问题、同源策略

jsonp解决跨域问题,前端script标签发送get请求不受到同源策略的影响、然后把数据带回来、前端定义函数、后端调用函数

jQuery封装的jsonp

uuid、随机的生成一个字符串,至少在几百年内唯一的这么一个id、一种特殊的算法、所处的地理位置、经纬度、以及当前电脑的时间,内存条的序列号,网卡的mac地址,这些东西给你拼凑,然后经过一个算法生成的

cors解决跨域、浏览器的ajax引擎 xhr得借助ajax引擎,ajax引擎特别听一个人的话那就是同源策略,你打他一顿,下次他不敢拦你了,这是把问题解决了

jquery的jsonp是绕过去了、cors是怎么解决的,你得需要一些特殊的响应头,同源策略并不是限制请求不能发送过去,而是限制的请求不能回来,他的策略就是,他相应数据的时候并不单单把数据响应回来,而是给你的脑门上贴一些特殊的相应头,

Access-Control-Allow-Origin

访问-控制-允许-源

Access-Control-Expose-Headers —能解决简单请求 get post

访问-控制-暴漏-请求头

Access-Control-Allow-Methods --put delete, 复杂请求会发送两次请求,第一次是嗅探请求,也被称为是预请求 options

访问-控制-允许-方法

反向代理工具解决跨域问题

函数对象与实例对象

回调函数

​ 我们定义的,我们没有调用,但是自己执行了

回调函数的分类

​ 同步的回调、主线程上立即执行,不进回调队列(数组遍历相关的回调)

​ 异步的回调、不会立即执行、 会放入回调队列(定时器回调/ajax回调)

js的错误类型/错误的处理

Promise初步认识(Es6)异步编程的新方案,就方案,纯回调 三个状态两个回调、是一个内置的构造函数

作用是封装一个异步任务,构造函数,传入一个执行器函数,封装异步任务,切换Promise状态,.then执行成功和失败的回调

//创建一个Promise实例对象
const p = new Promise((resolve, reject)=>{reject('ok')
})
console.log('@',p); //一般不把Promise实例做控制台输出

6.9、验证Promise的返回值

实验:.then方法会返回一个新的Promise实例对象。(暂且不研究返回的这个新Promise实例状态怎么变化)

const p = new Promise((resolve,reject)=>{setTimeout(()=>{resolve(100)},1000)
})
const x = p.then(value => {console.log('成功了',value);},reason =>{console.log('失败了',reason);}
)
console.log('50',x); 
//他是p嘛?
console.log(p===x)?

结论:.then方法返回一个新的Promise实例

6.1、PromiseApi解读

1、刚才我们已经讲了,Promise是一个内置的构造函数,他内部的执行器函数,有两个参数函数resolve函数和reject函数

2、Promise.then的返回值是一个新的Promise实例

3、代码折叠问题 #region #endregion

4、Promise.prototype.catch方法是Promise原型对象上的方法,是给实例用的、一般我们使用Promise的步骤就是,new 一个实例,在executor函数中封装异步任务,切换Promise实例的状态,.then执定成功的回调失败的回调,例如如下代码

const p = new Promise((resolve,reject)=>{setTimeout(()=>{resolve(100)},1000)
})
const x = p.then(value => {console.log('成功了',value);},reason =>{console.log('失败了',reason);}
)
console.log('50',x); 
//他是p嘛?
console.log(p===x)?

思考一个问题如果我要是不想指定成功的回调,控制台会报错嘛

const p = new Promise((resolve,reject)=>{setTimeout(()=>{resolve(100)},1000)
})
const x = p.then(undefined,reason =>{console.log('失败了',reason);}
)
console.log('50',x); 

不会报错?他的底层进行了处理,你要是没指定,就证明你不想指定,但是他并不会报错

现在我们传递的是一个undefined他不会报错,那么还可以传什么?空数组,空对象,null

想调用.then但是你就还不想指定成功的回调,官方推荐的做法,就是undefined

其实更好的做法就是使用.catch()

const p = new Promise((resolve,reject)=>{setTimeout(()=>{reject(-100)},1000)
})
p.then(value => {console.log('成功了1',reason);},reason => {console.log('失败了1',reason);}
)
p.catch(reason => {console.log('失败了2',reason);}
)

执行结果?

失败了1 失败了2、Promise内部有一个队列,放一组一组的回调

分析执行结果

const p = new Promise((resolve,reject)=>{setTimeout(()=>{reject(100)},1000)
})
p.then(value => {console.log('成功了',reason);},
)
p.catch(reason => {console.log('失败了',reason);}
)

切换成功状态,正常输出成功了

切换失败状态,输出失败了 100 和uncaught(in promise) 100

什么时候回出现uncaught(in promise)

那就是你不指定失败的回调就会返回这个东西,抛出了一个异常

他是按照队列的顺序,一个一个调用的,所以回出现这个问题,他跟刚才一个道理,只不过人家处理了默认就是成功了就是不抛出异常

因为MDN上说了,成功是一个积极向上的行为,所以不进行抛出异常

5、Promise.reject方法: Promise.reject方法(reason)

说明: 用于快速返回一个状态必为rejected的Promise实例对象

const p0 = Promise.reject(-100)
p0.then(value => {console.log('成功了',value);},reason => {console.log('失败了',reason);}
)

函数自身上的,和函数原型对象上的还不一样,放原型对象那么就是给实例用的,如果放在自身就是给自己用的,为啥要设计一个这样的api那?

我们想弄出来一个状态为成功或者状态的Promise,我该怎么写

原始写法

const p = new Promise((resolve,reject)=>{setTimeout(()=>{//成功或者失败reject(100)},1000)
})
p.then(value => {console.log('成功了1',reason);},reason => {console.log('失败了1',reason);}
)

简单写法

const p0 = Promise.reject(-100)
p0.then(value => {console.log('成功了',value);},reason => {console.log('失败了',reason);}

6、Promise.resolve方法: Promise.resolve(value)、

说明:用于快速返回一个状态为fulfilled或者rejected的Promise实例对象

有一句关键的话,返回一个状态为fulfilled或者rejected的Promise,为啥不跟reject一样,我调用你我就是返回一个状态为成功的Promise实例

唉这个还真有点不一样,因为他的状态会根据Promise.resolve(value) ,value不同返回不同状态的Promise实例

几种情况、两种! 非Promise值、那么就是成功、Promise值,不确定,传入的Promise实例是成功那么就是成功,失败的就是失败的

开发中不会写出这种代码的,一般都是面试代码分析

7、Promise.all(promiseArr)

promiseArr: 包含n个Promise实例的数组

说明: 返回一个新的Promise实例, 只有所有的promise都成功才成功, 只要有一个失败了就直接失败。

const p1 = Promise.resolve('a')
const p2 = new Promise((resolve,reject)=>{setTimeout(()=>{reject('b')},500)
})
const p3 = new Promise((resolve,reject)=>{setTimeout(()=>{reject('c')},2000)
})
const x = Promise.all([p1,p2,p3])
x.then(value => {console.log('成功了',value);},reason => {console.log('失败了',reason);}
) 

都成就成,把结果都拿回来,有一个失败就失败,顺序有关系吗?没有

7、Promise.race(promiseArr)

promiseArr: 包含n个Promise实例的数组

说明: 返回一个新的Promise实例, 成功还是很失败?以最先出结果的promise为准。

const p1 = Promise.reject('a')
const p2 = new Promise((resolve,reject)=>{setTimeout(()=>{resolve('b')},500)
})
const p3 = new Promise((resolve,reject)=>{setTimeout(()=>{reject('c')},2000)
})
const x = Promise.race([p3,p1,p2])
x.then(value => {console.log('成功了',value);},reason => {console.log('失败了',reason);}
)

6.2、PromiseApi实验代码

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Promise的API</title>
</head>
<body><!-- 1. Promise构造函数: new Promise (executor) {}executor函数: 是同步执行的,(resolve, reject) => {}resolve函数: 调用resolve将Promise实例内部状态改为成功(fulfilled)。reject函数: 调用reject将Promise实例内部状态改为失败(rejected)。说明: excutor函数会在Promise内部立即同步调用,异步代码放在excutor函数中。2. Promise.prototype.then方法: Promise实例.then(onFulfilled,onRejected)onFulfilled: 成功的回调函数 (value) => {}onRejected: 失败的回调函数 (reason) => {}特别注意(难点):then方法会返回一个新的Promise实例对象3. Promise.prototype.catch方法: Promise实例.catch(onRejected)onRejected: 失败的回调函数 (reason) => {}说明: catch方法是then方法的语法糖, 相当于: then(undefined, onRejected)4. Promise.resolve方法: Promise.resolve(value)说明: 用于快速返回一个状态为fulfilled或rejected的Promise实例对象备注:value的值可能是:(1)非Promise值  (2)Promise值5. Promise.reject方法: Promise.reject方法(reason)说明: 用于快速返回一个状态必为rejected的Promise实例对象6. Promise.all方法: Promise.all(promiseArr)promiseArr: 包含n个Promise实例的数组说明: 返回一个新的Promise实例, 只有所有的promise都成功才成功, 只要有一个失败了就直接失败。7. Promise.race方法: Promise.race(promiseArr)promiseArr: 包含n个Promise实例的数组说明: 返回一个新的Promise实例, 成功还是很失败?以最先出结果的promise为准。--><script type="text/javascript" >//验证:then方法会返回一个新的Promise实例对象。(暂且不研究返回的这个新Promise实例状态怎么变化)//#region /* const p = new Promise((resolve,reject)=>{setTimeout(()=>{resolve(100)},1000)})const x = p.then(value => {console.log('成功了',value);},reason =>{console.log('失败了',reason);})console.log('50'); *///#endregion//Promise.prototype.catch方法//#region /* const p = new Promise((resolve,reject)=>{setTimeout(()=>{reject(100)},1000)})p.then(value => {console.log('成功了1',reason);},reason => {console.log('失败了1',reason);})p.catch(reason => {console.log('失败了2',reason);}) *///#endregion//Promise.resolve//#region /* const p0 = Promise.reject(-100)const p = Promise.resolve(p0)p.then(value => {console.log('成功了',value);},reason => {console.log('失败了',reason);}) *///#endregion//Promise.reject//#region /* const p0 = Promise.resolve(100)const p = Promise.reject(p0)p.then(value => {console.log('成功了',value);},reason => {console.log('失败了',reason);}) *///#endregion//Promise.all//#region /* const p1 = Promise.resolve('a')const p2 = new Promise((resolve,reject)=>{setTimeout(()=>{reject('b')},500)})const p3 = new Promise((resolve,reject)=>{setTimeout(()=>{reject('c')},2000)})const x = Promise.all([p1,p2,p3])x.then(value => {console.log('成功了',value);},reason => {console.log('失败了',reason);}) *///#endregion//Promise.race/* const p1 = Promise.reject('a')const p2 = new Promise((resolve,reject)=>{setTimeout(()=>{resolve('b')},500)})const p3 = new Promise((resolve,reject)=>{setTimeout(()=>{reject('c')},2000)})const x = Promise.race([p3,p1,p2])x.then(value => {console.log('成功了',value);},reason => {console.log('失败了',reason);}) */</script>
</body>
</html>

6.3、如何改变Promise实例的状态

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>promise的几个关键问题1</title>
</head>
<body><!-- 1.	如何改变一个Promise实例的状态?(1)执行resolve(value): 如果当前是pending就会变为fulfilled(2)执行reject(reason): 如果当前是pending就会变为rejected(3)执行器函数(executor)抛出异常: 如果当前是pending就会变为rejected--><script type="text/javascript" >const p  = new Promise((resolve,reject)=>{console.log(a); //引擎抛异常// throw 900 //编码抛异常})p.then(value => {console.log('成功了',value);},reason => {console.log('失败了',reason);})</script>
</body>
</html>

相关文章:

前端工程化18-邂逅Promise(待更新)

6、邂逅Promise 6.1、函数对象与实例对象 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>准备_函数对象与实例对象</title> </head> <body><script>/* 函数对象、实例对象…...

Linux(ubuntu)系统的一些基本操作和命令(持续更新)

操作&#xff1a; Ctrl Alt T&#xff08;打开命令终端&#xff09; Ctrl Shift &#xff08;放大命令终端窗口&#xff09; Ctrl c&#xff08;退出当前在终端运行的程序&#xff09; 在命令终端窗口按Tab键可以补全要写的命令 命令&#xff1a; pwd&#xff08;查…...

IDEA Mac快捷键(自查询使用)

Editing&#xff08;编辑&#xff09; Control Space 基本的代码补全&#xff08;补全任何类、方法、变量&#xff09;Control Shift Space 智能代码补全&#xff08;过滤器方法列表和变量的预期类型&#xff09;Command Shift Enter 自动结束代码&#xff0c;行末自动添…...

认识redis 及 Ubuntu安装redis

文章目录 一. redis概念二. redis应用场景二. redis的特性四. 使用Ubuntu安装redis 一. redis概念 redis 是在内存中存储数据的中间件, 用在分布式系统 redis是客户端服务器结构的程序, 客户端服务器之间通过网络来通信 二. redis应用场景 redis可用作数据库 类似MySQL, 但…...

6.结果处理组件之ResponseHandler

前言 feign发送完请求后, 拿到返回结果, 那么这个返回结果肯定是需要经过框架进一步处理然后再返回到调用者的, 其中ResponseHandler就是用来处理这个返回结果的, 这也是符合正常思维的处理方式, 例如springmvc部分在调用在controller端点前后都会增加扩展点。 从图中可以看得…...

【C#】调用外部应用

以WINFORM应用程序为例&#xff0c;在C#应用程序中调用PYTHON程序&#xff08;Matplotlib绘制图形程序&#xff09;&#xff0c;将调用PYTHON程序生成的窗口程序嵌入在WINFORM窗口中 窗口程序类 using System; using System.Collections.Generic; using System.Data; using S…...

JavaWeb--JDBC

JDBC&#xff08;Java Database Connectivity&#xff0c;Java数据库连接&#xff09;是一种Java API&#xff0c;可以让Java程序连接到数据库并进行数据的操作。它是Java平台的一部分&#xff0c;由Sun Microsystems&#xff08;现为Oracle Corporation的一部分&#xff09;开…...

神经网络归一化方法总结

在深度学习中&#xff0c;归一化 是提高训练效率和稳定性的关键技术。以下是几种常见的神经网络归一化方法的总结&#xff0c;包括其核心思想、适用场景及优缺点。 四种归一化 特性Batch NormalizationGroup NormalizationLayer NormalizationInstance Normalization计算维度…...

Debian/Ubuntu 、Fedora 、Arch Linux, 在Linux上,对文本文件进行多线程压缩 xz、pxz、zstd、7z、lrzip

Debian/Ubuntu 、Fedora 、Arch Linux&#xff0c; 在Linux上&#xff0c;对文本文件进行多线程压缩 xz、pxz、zstd、7z、lrzip 前言对比多线程压缩1. 使用 pxz安装 pxz使用 pxz 2. 使用 xz 的 -T 选项使用 xz -T 3. 其他压缩命令1. 使用 gzip2. 使用 bzip23. 使用 xz4. 使用 7…...

前端使用fontfaceobserver库实现字体设置

要使用FontFaceObserver来加载设置项目本地的字体&#xff0c;先确保字体文件位于项目中或者可以从服务端获取到&#xff0c;这样就可以使用FontFaceObserver来检测并加载这些字体 主要有以下几步&#xff1a; npm或者yarn安装引入fontfaceobserver字体资源引入和font-face配置…...

SSM--SpringMVC复习(二)

请求 URL匹配&#xff1a; RequestMapping RequestMapping 负责将请求映射到对应的控制器方法上。 RequestMapping 注解可用于类或方法上。用于类上&#xff0c;表示类中的所有响应请求的方法都以该地址作为父路径。 在整个 Web 项目中&#xff0c;RequestMapping 映射的请求…...

Oracle 11gR2 坏块修复实例一则

背景 前段时间在 Oracle 11gR2 数据库中发现了坏块问题。环境是 64 位 Linux 平台。本文将详细介绍如何使用 DBMS_REPAIR 进行在线修复&#xff0c;当然也可以基于备份和 RMAN 的修复方法这里暂时不做介绍。 发现坏块 1. 从 alert.log 中发现错误 在 alert.log 文件中发现了…...

使用 Docker Compose 来编排部署LMTNR项目

使用 Docker Compose 来部署一个包含 Linux、MySQL、Tomcat、Nginx 和 Redis 的完整项目的例子。假设我们要部署一个简单的 Java Web 应用&#xff0c;并且使用 Nginx 作为反向代理服务器。 项目目录结构 首先需要确保 Docker 和docker-compose已经安装并正在运行。docker --v…...

el-table 根据屏幕大小 动态调整max-height 的值

<template><div><p>窗口高度&#xff1a;{{ windowHeight }} px</p></div> </template><script> export default {data() {return {// 下面的 -250 表示减去一些表单元素高度 这个值需要自己手动调整windowHeight: document.docume…...

el-cascader 使用笔记

1.效果 2.官网 https://element.eleme.cn/#/zh-CN/component/cascader 3.动态加载&#xff08;官网&#xff09; <el-cascader :props"props"></el-cascader><script>let id 0;export default {data() {return {props: {lazy: true,lazyLoad (…...

Cookie概念和API

Cookie概念 Cookie在HTTP中它表示服务器送给客户端浏览器的小甜点。其实Cookie就是一个键和一个值构成的&#xff0c;随着服务器端的响应发送给客户端浏览器。然后客户端浏览器会把Cookie保存起来&#xff0c;当下一次再访问服务器时把Cookie再发送给服务器。 Cookie是由服务器…...

Linux服务器安装mongodb

因为项目需要做评论功能&#xff0c;领导要求使用mongodb&#xff0c;所以趁机多学习一下。 在服务器我们使用docker安装mongodb 1、拉取mongodb镜像 docker pull mongo &#xff08;默认拉取最新的镜像&#xff09; 如果你想指定版本可以这样 docker pull mongo:4.4&#…...

32.4 prometheus存储磁盘数据结构和存储参数

本节重点介绍 : prometheus存储磁盘数据结构介绍 indexchunkshead chunksTombstoneswal prometheus对block进行定时压实 compactprometheus 查看支持的存储参数 prometheus存储示意图 内存和disk之间的纽带 wal WAL目录中包含了多个连续编号的且大小为128M的文件&#xff0c…...

两个生活中的例子反向理解正/反向代理?

正向代理 场景&#xff1a;你在学校里想访问一个被限制的网站&#xff0c;比如某个社交媒体平台。 操作方式&#xff1a; 你把访问请求发送给学校的代理服务器&#xff08;正向代理&#xff09;。代理服务器代表你向互联网发出请求&#xff0c;去访问那个受限的网站。网站的响…...

数据结构-线性表

数据结构-线性表 线性表的任意元素存放地址&#xff1a;Ai a1 L *(i-1) 当i0 则 Aia0L*i 少了一次计算 按照计算方法&#xff0c;当下标为0&#xff0c;可以少执行一次减法&#xff0c;这也是c数组下标取0的原因。 无论n多大都是一个固定时间称之为O(1) 时间复杂度 顺序表的运…...

Python酷库之旅-第三方库Pandas(245)

目录 一、用法精讲 1156、pandas.tseries.offsets.MonthEnd.is_month_start方法 1156-1、语法 1156-2、参数 1156-3、功能 1156-4、返回值 1156-5、说明 1156-6、用法 1156-6-1、数据准备 1156-6-2、代码示例 1156-6-3、结果输出 1157、pandas.tseries.offsets.Mon…...

贵阳思普信息技术有限公司 OA系统 apilogin 接口存在SQL注入漏洞风险

免责声明: 本文旨在提供有关特定漏洞的深入信息,帮助用户充分了解潜在的安全风险。发布此信息的目的在于提升网络安全意识和推动技术进步,未经授权访问系统、网络或应用程序,可能会导致法律责任或严重后果。因此,作者不对读者基于本文内容所采取的任何行为承担责任。读者在…...

重学 Android 自定义 View 系列(九):侧边字母选择器

前言 本文来实现一个侧边字母选择器&#xff0c;很常见的一个控件&#xff0c;和上篇文章星星评分用到的关键技术点类似&#xff0c;难度不大&#xff0c;本篇再来温故知新一下。 最终效果如下&#xff1a; 1. 效果分析 每个字母被均匀分布在整个控件区域中&#xff1b;触摸…...

网络原理->DNS协议和NAT协议解

前言 大家好我是小帅&#xff0c;今天我们来了解应用层的DNS协议和NAT技术 个人主页&#xff1a;再无B&#xff5e;U&#xff5e;G 文章目录 1.重要应⽤层协议DNS(Domain Name System)1.1 DNS背景 2. NAT技术3. 总结 1.重要应⽤层协议DNS(Domain Name System) DNS是⼀整套从域…...

亚马逊开发视频人工智能模型,The Information 报道

根据《The Information》周三的报道&#xff0c;电子商务巨头亚马逊&#xff08;AMZN&#xff09;已开发出一种新的生成式人工智能&#xff08;AI&#xff09;&#xff0c;不仅能处理文本&#xff0c;还能处理图片和视频&#xff0c;从而减少对人工智能初创公司Anthropic的依赖…...

【JS】React与Vue的异步编程对比:深度解析与实战案例全面指南

文章目录 前言更多实用工具React与Vue概述ReactVue 异步编程基础回调函数PromiseAsync/Await React中的异步编程使用Axios进行数据请求异步操作与组件生命周期React Hooks中的异步处理 Vue中的异步编程使用Axios进行数据请求异步操作与Vue生命周期Vue Composition API中的异步处…...

CTF-WEB: 2024强网杯青少年专项赛 ezFindShell writeup

打开直接下载www.zip 通过百度网盘分享的文件&#xff1a;ezFindShell.zip 链接&#xff1a;https://pan.baidu.com/s/1JQjOk-qxaOf0s4f3Fgww7w?pwd1111 提取码&#xff1a;1111 --来自百度网盘超级会员V2的分享使用阿里webshell进行检测,找到可利用文件,或者直接全全局搜索…...

docker网络配置

文章目录 前言一、docker网络访问原理二、docker配置多台机器可以相互访问三、高级网络配置四、最佳实践总结前言 在当今的软件开发和运维领域,Docker 已经成为了容器化服务的标准之一。它不仅简化了应用的部署过程,还大大提高了资源利用率。然而,随着Docker应用的深入,网…...

AI生成的一个.netcore 经典后端架构

下面是一个完整的 .NET Core 后端项目示例&#xff0c;使用 Dapper 作为轻量级 ORM 访问 Oracle 数据库&#xff0c;并实现高性能架构。我们将实现学生表、课程表、成绩表和班级表的基本增删改查功能&#xff0c;以及查询某个班级学生成绩的功能&#xff0c;并使用自定义缓存来…...

docker学习的初识

一、docker官方安装地址: 根据官网找对应的环境,相关的安装命令自行官网不在累赘; 查看Docker的版本号:docker -v Docker version 27.3.1, build ce12230查看相应的镜像docker images REPOSITORY TAG IMAGE ID CREATED SIZE docker/wel…...

【Git】Git 完全指南:从入门到精通

Git 完全指南&#xff1a;从入门到精通 Git 是现代软件开发中最重要的版本控制工具之一&#xff0c;它帮助开发者高效地管理项目&#xff0c;支持分布式协作和版本控制。无论是个人项目还是团队开发&#xff0c;Git 都能提供强大的功能来跟踪、管理代码变更&#xff0c;并保障…...

webrtc ios h264 硬编解码

webrtc ios h264 硬编解码 一 ios 系统支持 从ios8开始&#xff0c;苹果公司开放了硬解码和硬编码API&#xff08;即 VideoToolbox.framework API&#xff09; 二 主要api 1 主要解码函数 VTDecompressionSessionCreate // 创建解码 session VTDecompressionSession…...

ubuntu20.04更换安装高版本CUDA以及多个CUDA版本管理

Ubuntu 20.04下多版本CUDA的安装与切换 CUDA安装配置环境变量软连接附上参考博客CUDA安装 cuda官方下载地址 因为我需要安装的是11.1版本的,所以这里按着11.1举例安装 安装命令如下: wget https://developer.download.nvidia.com/compute/cuda/11.1.0/local_installers/cu…...

生鲜食品o2o商城系统|Java|SSM|VUE| 前后端分离

【重要1⃣️】前后端源码万字文档部署文档 【重要2⃣️】正版源码有问题包售后 【重要3⃣️】可复制品不支持退换货 【包含内容】 【一】项目提供非常完整的源码注释 【二】相关技术栈文档 【三】源码讲解视频 【其它服务】 【一】可…...

C 语言静态库与动态库的生成和使用

在 YouTube 上找到一个视频 动态链接库静态链接库的生成和使用&#xff0c;它把用 GCC 生成静态库和动态库&#xff0c;以及如何使用他们说的很明白&#xff0c;有条件的可以直接看那个视频。本文就是一个观后的实操和笔记&#xff0c;加添了更多如何查看动态库&#xff0c;静态…...

分布式锁的实现方案有哪些?各自的原理是怎样的?使用场景有哪些?与单体架构中锁区别?存在哪些问题?如何解决?注意事项?

一、分布式锁的实现方案 分布式锁的实现方案主要包括以下几种&#xff1a; 基于数据库的分布式锁&#xff1a; 利用数据库的事务特性来实现锁功能。在数据库中创建一个具有唯一约束的锁表&#xff0c;加锁时插入一行记录&#xff0c;释放锁时删除这行记录。简单易用&#xf…...

企业如何落地搭建商业智能BI系统

随着新一代信息化、数字化技术的应用&#xff0c;引发了新一轮的科技革命&#xff0c;现代化社会和数字化的联系越来越紧密&#xff0c;数据也变成继土地、劳动力、资本、技术之后的第五大生产要素&#xff0c;这一切都表明世界已经找准未来方向&#xff0c;前沿科技也与落地并…...

python学习——元组的创建于删除

在 Python 中&#xff0c;元组&#xff08;tuple&#xff09;是一种内置的数据类型&#xff0c;用于存储不可变的有序元素集合。以下是关于 Python 元组的一些关键点&#xff1a; 文章目录 定义元组1. 使用圆括号 ()2. 使用 tuple() 函数3. 使用单个元素的元组4. 不使用圆括号…...

智能化图书馆导航系统方案之系统架构与核心功能设计

hello~这里是维小帮&#xff0c;点击文章最下方获取图书馆导航系统解决方案&#xff01;如有项目需求和技术交流欢迎大家私聊我们~撒花&#xff01; 针对传统图书馆在图书查找困难、座位紧张、空间导航不便方面的问题&#xff0c;本文深入剖析了基于高精度定位、3D建模、图书搜…...

Linux网络——IO模型和多路转接

通常所谓的IO&#xff0c;其本质就是等待通信和进行通信&#xff0c;即IO 等 拷贝。 那么想要做到高效的IO&#xff0c;就要在单位时间内&#xff0c;减少“等”的比重。 一.五种IO模型 阻塞 IO: 在内核将数据准备好之前, 系统调用会一直等待. 所有的套接字, 默认都是阻塞方…...

浅谈网络 | 应用层之HTTP协议

目录 HTTP 请求的准备HTTP 请求的构建HTTP 请求的发送过程HTTP 返回的构建HTTP 2.0QUIC 协议HTTP 3.0 在讲完传输层之后&#xff0c;我们接下来进入应用层的内容。应用层的协议种类繁多&#xff0c;那从哪里开始讲起呢&#xff1f;不妨从我们最常用、最熟悉的 HTTP 协议 开始。…...

【CSS】页面滚动到一定位置时,指定区域固定不变

一. 需求 移动端&#xff1a;下滑时&#xff0c;当下滑到一定位置时&#xff0c;指定区域不跟随下滑-【固定跟随区域】一直在顶部效果 &#xff08;1&#xff09;未滚动前 &#xff08;2&#xff09;滚动后 二. 实现 <template><div class"global-application…...

瀚高创库建表pgsql

1.瀚高下载地址&#xff1a; 下载 (highgo.com)https://www.highgo.com/down_main.html 2.瀚高linux安装 上传deb文件到ubuntu系统中 执行 dpkg -i hgdb-see-4.5.8-fe4791c.x86_64.deb 命令安装数据库 安装完成后&#xff0c;会在/opt 目录下生成安装目录 数据库安装完毕后…...

Vim 高级操作与技巧指南

在上一篇文章中&#xff0c;我们了解了 Vim 的基本操作和模式&#xff0c;掌握了如何进行文件编辑、光标移动、文本操作等基本技能。现在&#xff0c;我们将深入探讨 Vim 的一些高级功能&#xff0c;包括插件管理、脚本编写、定制快捷键等内容&#xff0c;以进一步提高你的工作…...

Vue3.0里为什么要用 Proxy API 替代 defineProperty API ?

Vue 3.0 之所以使用 Proxy API 替代 Object.defineProperty,主要是为了提升性能、减少代码复杂性,并解决 Vue 2.x 在响应式处理中的一些局限性。下面我们通过对比这两种方式的工作原理、优缺点,并结合实际项目代码示例来详细讲解。 1. Object.defineProperty 的局限性 在 …...

【基于规则】n-sigma

在正态分布中: 约68%的数据点会落在均值1σ的范围内约95%的数据点会落在均值2σ的范围内约99.7%的数据点会落在均值3σ的范围内这称为68-95-99.7法则(Empirical Rule)。 假设我们有一组数据,其均值为μ,标准差为σ。某个数据点x的n-sigma计算公式如下: 若z=1.2,说明该…...

JavaScript 判断字符串是否包含子字符串的几种方法

这里写目录标题 方法 1: 使用 includes()方法 2: 使用 indexOf()方法 3: 使用正则表达式方法 4: 使用 search()方法 5: 用 startsWith() 或 endsWith()推荐使用 JavaScript 判断字符串是否包含子字符串&#xff0c;不要只知道 indexOf() &#xff0c;还可以尝试一下其他写法。 …...

goframe框架bug-记录

implement not found for interface ICompany, forgot register? 错误解决检查&#xff1a; 1.有没有init 2. 注入问题 3. 注入问题...

Docker:在 ubuntu 系统上生成和加载 Docker 镜像

本文将介绍在 ubuntu系统上进行 Docker 镜像的生成和加载方法和代码。 文章目录 一、下载和安装 docker二、加载 docker 文件三、保存你的镜像四、将镜像上传到云端并通过连接下载和加载 Docker 镜像五、Docker 容器和本地的文件交互5.1 从容器复制文件到本地宿主机5.1.1 单个文…...

长时间无事可做是个危险信号

小马加入的是技术开发部&#xff0c;专注于Java开发。团队里有一位姓隋的女同事&#xff0c;是唯一的web前端工程师&#xff0c;负责页面开发工作&#xff0c;比小马早两个月入职。公司的项目多以定制化OA系统为主&#xff0c;后端任务繁重&#xff0c;前端工作相对较少。在这样…...