【b站咸虾米】ES6 Promise的用法,ES7 async/await异步处理同步化,异步处理进化史

news2024/11/18 9:39:58

课程地址:【ES6 Promise的用法,ES7 async/await异步处理同步化,异步处理进化史】 https://www.bilibili.com/video/BV1XW4y1v7Md/?share_source=copy_web&vd_source=b1cb921b73fe3808550eaf2224d1c155

图文地址:https://www.bilibili.com/read/cv18799030/?spm_id_from=333.999.0.0

目录

Promise介绍

1.1 异步请求的痛点-回调地狱

1.2 用callback回调函数的方式封装返回值

1.2.1 getNav()

1.2.2 getList()

1.2.3 getComment()

1.2.4 完整代码

1.3 Promise的三种状态和then的链式调用法改造

1.3.1 实例化后的原型

1.3.2 Promise的3种状态

1 pending

2 resolve

3 reject

1.3.3 Promise处理异步

1 resolve和reject方法

2 then方法

3 catch方法

1.3.4 对函数进行改造

1 获取导航列表

2 获取新闻列表

3 获取当前新闻的评论

1.3.5 总结

1.4 Promise.all封装多个对象统一处理方案

1.4.1 catch方法

1.4.2 封装多个对象

1.5 async await异步处理同步化对代码重构

1.5.1 函数再改造

1.5.2 总结


Promise介绍

这门课主要讲解 解决异步请求 的方案,讲解 异步请求 的进化史。

同步和异步的问题,其实就是编程的思路。

JavaScript是单线程的程序,代码是顺序执行的,是一行一行的执行的。对于简单的代码,单线程是可以完全解决问题的。但是如果涉及网络请求,网络请求是根据网速和服务器带宽决定的。有的时候网络请求比较慢,出现 超时情况。如果下一行代码依赖上一行,会导致网页失去响应。

因为上述问题的存在,所以出现异步。异步与同步相反,代码执行不是按照顺序进行的。遇到网络请求,发送请求,等请求进行响应,然后再回来执行,这个过程的代码继续往下执行,打破了顺序的关系。

理论上讲,异步执行的效率更高一些。异步请求是前端常用的方式。

1.1 异步请求的痛点-回调地狱

同步的问题在于 效率不高,异步也存在问题——回调地狱。

回调地狱:异步调用获取到结果后,为下一个异步函数提供参数,所以就会一层一层出现回调里面嵌入回调,导致层次很深,代码维护起来特别的复杂。

出现回调地狱问题,ES6有Promise方法来解决回调地狱问题。

创建一个uniapp项目来体会下。

(创建一个uniapp项目可以见【b站咸虾米】chapter1&2_uniapp介绍与uniapp基础_新课uniapp零基础入门到项目打包(微信小程序/H5/vue/安卓apk)全掌握_uniapp 打包微信app 配置-CSDN博客)

<script>
	export default {
		data() {
			return {
				title: 'Hello'
			}
		},
		onLoad() {
			this.getData();

		},
		methods: {
			getData(){
			  //获取分类列表id
			  uni.request({
				url:"https://ku.qingnian8.com/dataApi/news/navlist.php",
				success:res=>{
				  let id=res.data[0].id;
				  console.log(res);
				  // 根据分类id获取该分类下的所有文章
				  uni.request({
					url:"https://ku.qingnian8.com/dataApi/news/newslist.php",
					data:{
					  cid:id
					},
					success:res2=>{
					  //获取到一篇文章的id,根据文章id找到该文章下的评论
					  let id=res2.data[0].id;
					  console.log(res2);
					  uni.request({
						url:"https://ku.qingnian8.com/dataApi/news/comment.php",
						data:{
						  aid:id
						},
						success:res3=>{
						  //找到该文章下所有的评论
						  console.log(res3)
						}
					  })
					}
				  })
				}
			  })
			} 
		}
	}
</script>

返回的结果

res3返回一个空数组。

以上就是原来常用的方式,这就是当时异步请求的痛点。

因此引入了Promise,来解决上述的问题。

1.2 用callback回调函数的方式封装返回值

1.2.1 getNav()

体会callback的作用,就是将getNav请求到的结果res作为参数返回到callback中进行处理。

		onLoad() {
			this.getNav(res=>{
				console.log(res);
				let id = res.data[0].id;
			});

		},
		methods: {
            // 获取导航列表
			// callback是函数getNav的一个回调函数
			getNav(callback) {
				uni.request({
					url: 'https://ku.qingnian8.com/dataApi/news/navlist.php',
					success: res=> {
						// console.log(res);
						callback(res); // 将res返回到callback中,因此
                        //在调用getNav时,callback会作为回调函数去执行
					}
				})
			},

请求返回的结果

1.2.2 getList()

在getNav方法的基础上,使用getList方法获取新闻列表。

getList方法的定义,也是有一个回调函数callback。

回调函数可以随便起名,callback是常用的名字。

            // 获取新闻列表
			getList(id, callback) {
				uni.request({
					url: 'https://ku.qingnian8.com/dataApi/news/newslist.php',
					data: {
						cid: id
					},
					success: res=>{
						// console.log(res);
						callback(res);// 将res作为实参返回给callback中
					}
				})
			},

在getNav方法中调用getList方法。

		onLoad() {
			this.getNav(res=>{
				console.log(res);
				let id = res.data[0].id;
				this.getList(id, res => {
					console.log(res);
				});
			});
		},

执行结果。

1.2.3 getComment()

getComment()定义。

            // 获取当前新闻的评论
			getComment(id, callback){
				uni.request({
					url: 'https://ku.qingnian8.com/dataApi/news/comment.php',
					data: {
						aid: id
					},
					success: res => {
						callback(res);
					}
				})
			},

调用getComment方法

    onLoad() {
			this.getNav(res=>{
				console.log(res);
				let id = res.data[0].id;
				this.getList(id, res => {
					console.log(res);
					let id = res.data[0].id;
					this.getComment(id, res=>{
						console.log(res);
					})
				});
			});
		},

效果

有点问题,没有返回值(可能是接口有问题,不管了)

1.2.4 完整代码

可以发现,使用callback回调函数将 三层网络请求 独立出来了,可读性要比1.1的实现好一些。

 传统型的回调函数作回调处理。

在es6之前,最常用这种方式。其实这种方式还是 回调地狱,拿到上一个结果后,再处理另一个请求,这个请求拿到结果后,再处理下一个请求。

之前1.1节内容的所有请求都写在一起,可维护性差。这里将1.1节的函数封装出去,在调用的时候看上去更加简单。

这是异步处理的1.0版本。

			// 传统型的回调函数作回调处理
			this.getNav(res=>{
				let id = res.data[0].id;
				this.getList(id, res => {
					let id = res.data[0].id;
					this.getComment(id, res=>{
						console.log(res);
					})
				});
			});
		},

以上就是回调函数作异步处理。

完整代码如下:

<script>
	export default {
		data() {
			return {
				title: 'Hello'
			}
		},
		onLoad() {
			this.getNav(res=>{
				console.log(res);
				let id = res.data[0].id;
				this.getList(id, res => {
					console.log(res);
					let id = res.data[0].id;
					this.getComment(id, res=>{
						console.log(res);
					})
				});
			});
		},
		methods: {
			// 获取导航列表
			// callback是函数getNav的一个回调函数
			getNav(callback) {
				uni.request({
					url: 'https://ku.qingnian8.com/dataApi/news/navlist.php',
					success: res=> {
						// console.log(res);
						callback(res); // 将res返回到callback中,因此在调用getNav时,callback会作为回调函数去执行
					}
				})
			},
			// 获取新闻列表
			getList(id, callback) {
				uni.request({
					url: 'https://ku.qingnian8.com/dataApi/news/newslist.php',
					data: {
						cid: id
					},
					success: res=>{
						// console.log(res);
						callback(res);// 将res作为实参返回给callback中
					}
				})
			},
			// 获取当前新闻的评论
			getComment(id, callback){
				uni.request({
					url: 'https://ku.qingnian8.com/dataApi/news/comment.php',
					data: {
						aid: id
					},
					success: res => {
						callback(res);
					}
				})
			}
		}
	}
</script>

1.3 Promise的三种状态和then的链式调用法改造

下面来看es6以后,promise的实现方式。是现在比较主流的一种形式。

promise就是一种解决异步的处理方式,本质是一个构造函数。

可以用来实例化一个对象,对象身上有resolve、reject和all,原型上有 then 和 catch方法。

promise对象有3种状态,pending(进行中)、resolved/fullfilled(成功)、rejected(失败)。

1.3.1 实例化后的原型

执行console.dir(Promise)   Promise是个构造函数。

结果

Promise实例化对象的原型

1.3.2 Promise的3种状态

1 pending

1. pending。它的意思是 "待定的,将发生的",相当于是一个初始状态。创建Promise对象时,且没有调用resolve或者是reject方法,相当于是初始状态。这个初始状态会随着你调用resolve,或者是reject函数而切换到另一种状态。

举例。

			// 实例化一个对象
			// resolve和reject可以用任意合法变量名称(比如a、b)代替,但是最好不要这样
			let p = new Promise((resolve, reject)=>{
				
			});
			
			console.log(p);

此时的p,在pending状态,表示什么也没发生。

2 resolve

2. resolved。表示解决了,就是说这个承诺实现了。 要实现从pending到resolved的转变,需要在 创建Promise对象时,在函数体中调用了resolve方法。

举例

			// 实例化一个对象
			// resolve和reject可以用任意合法变量名称(比如a、b)代替,但是最好不要这样
			let p = new Promise((resolve, reject)=>{
				resolve(1);
			});
			
			console.log(p);

结果

3 reject

3. rejected。拒绝,失败。表示这个承诺没有做到,失败了。要实现从pending到rejected的转换,只需要在创建Promise对象时,调用reject函数。 

			// 实例化一个对象
			// resolve和reject可以用任意合法变量名称(比如a、b)代替,但是最好不要这样
			let p = new Promise((resolve, reject)=>{
				reject(1);
			});
			
			console.log(p);

1.3.3 Promise处理异步

Promise用来处理异步。

之前用回调函数callback,但是其实是不合理的。如果返回两个参数,难道要写两个函数吗?因此是不合理的。

1 resolve和reject方法

这里回调函数有两个,请求成功,执行resolve回调函数,返回res,请求失败,执行reject回调函数,返回err。

			// 实例化一个对象
			// resolve和reject可以用任意合法变量名称(比如a、b)代替,但是最好不要这样
			let p = new Promise((resolve, reject)=>{
				uni.request({
					url:'https://ku.qingnian8.com/dataApi/news/navlist.php',
					success: res=>{
						resolve(res);
					},
					fail: err=> { // 失败,请求无效的时候会走这里
						reject(err);
					}
				})
			});
			
			console.log(p);

请求成功,打印出来的p如下

请求失败(比如地址url不存在),打印出来的p如下

以上,请求成功,执行resolve回调函数,返回res,请求失败,执行reject回调函数,返回err。

请求成功和失败都进行了返回,成功返回res,失败返回err,怎么去用呢?

使用原型的then方法。

2 then方法

这里的p就是返回值。

p本质是个Promise对象。那么p的值在哪呢?

直接写个p.then()。p可以接收resolve和reject的返回值,请求成功就执行then方法。

res的值打印出来如下

3 catch方法

那么请求失败的时候,使用catch方法。

如果请求失败了,那么resolve就不返回res了,而是reject返回错误信息。然后p接收reject的返回值,执行catch方法。

结果,返回错误信息,并打印。

1.3.4 对函数进行改造

1 获取导航列表
		methods: {
			// 获取导航列表,返回一个Promise对象
			getNav() {
				return new Promise((resolve, reject)=>{
					uni.request({
						url: 'https://ku.qingnian8.com/dataApi/news/navlist.php',
						success: res=> {
							resolve(res); 
						},
						fail: err=> {
							reject(err);
						}
					})
				})
				
			},

在onLoad里调用getNav方法。

请求成功,Promise对象(this.getNav(返回的对象)接收resolve的返回值,执行then方法处理返回值res。

结果

成功返回数据

2 获取新闻列表
            // 获取新闻列表
			getList(id) {
				return new Promise ((resolve, reject)=>{
					uni.request({
						url: 'https://ku.qingnian8.com/dataApi/news/newslist.php',
						data: {
							cid: id
						},
						success: res=>{
							resolve(res);
						},
						fail: err=>{
							reject(err);
						}
					})
				})
			},

调用

此时将18-26行的整个then方法看做一个整体,这是一个函数,函数的返回值又是一个Promise对象,则可以在这个Promise对象后面直接写then方法。这就是then的链式调用

			this.getNav().then(res=>{
				console.log(res);
				let id = res.data[0].id;
				// this.getList(id);
				// this.getList(id) 是一个Promise对象,我们要想用他的then方法,怎么办呢?
				// 直接在此处return这个Promise对象
				return this.getList(id);
				// 这里直接returnPromise对象,相当于把这个Promise返回出去了。
			}).then(res=>{
				console.log(res);
			})

结果

执行成功。

提示:getList()返回一个Promise对象。我们只是将getNav()的参数传给getList(),并没有对这个Promise对象做处理。

接着就对他进行return了,return之后,以下红框内的就是一个Promise对象,如果处于fulfilled状态,那么是有返回值的,返回值就包括在then方法里。

这里的res就是getList()的返回值。

3 获取当前新闻的评论
            // 获取当前新闻的评论
			getComment(id){
				return new Promise((resolve, reject)=>{
					uni.request({
						url: 'https://ku.qingnian8.com/dataApi/news/comment.php',
						data: {
							aid: id
						},
						success: res => {
							resolve(res);
						},
						fail:err=>{
							reject(err);
						}
					})
				})
			},

然后调用上述方法。

		onLoad() {
			this.getNav().then(res=>{
				console.log(res);
				let id = res.data[0].id;
				return this.getList(id);
			}).then(res=>{
				console.log(res);
				let id = res.data[0].id;
				return this.getComment(id);
			}).then(res=>{
				console.log(res);
			})
		},

结果

接口有问题,还是返回这个

1.3.5 总结

使用回调函数封装,实际还是一层层嵌套。

现在不属于嵌套了,这样代码清晰明了。

将层层嵌改为链式调用。以前的都是一环套一环,俄罗斯套娃,现在是用链式关联。这样阅读代码可以一块一块看,比嵌套的方式更加容易维护。

这是异步请求处理的2.0版本。(回调函数callback是1.0版本)。2.0版本后是3.0版本es7的方式。

这种方式非常好读,比回调地狱易用性很高。

完整代码

<script>
	export default {
		data() {
			return {
				title: 'Hello'
			}
		},
		async onLoad() {
			this.getNav().then(res=>{
				let id = res.data[0].id;
				return this.getList(id);
			})
			.then(res=>{
				let id = res.data[0].id;
				return this.getComment(id);
			})
			.then(res=>{
				console.log(res);
			});
		},
		methods: {
			// 获取导航列表,返回一个Promise对象
			getNav() {
				return new Promise((resolve, reject)=>{
					uni.request({
						url: 'https://ku.qingnian8.com/dataApi/news/navlist.php',
						success: res=> {
							resolve(res); 
						},
						fail: err=> {
							reject(err);
						}
					})
				})
				
			},
			// 获取新闻列表
			getList(id) {
				return new Promise ((resolve, reject)=>{
					uni.request({
						url: 'https://ku.qingnian8.com/dataApi/news/newslist.php',
						data: {
							cid: id
						},
						success: res=>{
							resolve(res);
						},
						fail: err=>{
							reject(err);
						}
					})
				})
			},
			// 获取当前新闻的评论
			getComment(id){
				return new Promise((resolve, reject)=>{
					uni.request({
						url: 'https://ku.qingnian8.com/dataApi/news/comment.php',
						data: {
							aid: id
						},
						success: res => {
							resolve(res);
						},
						fail:err=>{
							reject(err);
						}
					})
				})
			},
			getData(){
			  //获取分类列表id
			  uni.request({
				url:"https://ku.qingnian8.com/dataApi/news/navlist.php",
				success:res=>{
				  let id=res.data[0].id;
				  console.log(res);
				  // 根据分类id获取该分类下的所有文章
				  uni.request({
					url:"https://ku.qingnian8.com/dataApi/news/newslist.php",
					data:{
					  cid:id
					},
					success:res2=>{
					  //获取到一篇文章的id,根据文章id找到该文章下的评论
					  let id=res2.data[1].id;
					  console.log(res2);
					  uni.request({
						url:"https://ku.qingnian8.com/dataApi/news/comment.php",
						data:{
						  aid:id
						},
						success:res3=>{
						  //找到该文章下所有的评论
						  console.log(res3)
						}
					  })
					}
				  })
				}
			  })
			} 
		}
	}
</script>

1.4 Promise.all封装多个对象统一处理方案

(还是异步请求2.0版本)

1.4.1 catch方法

catch只会存在一个。

代码

			this.getNav().then(res=>{
				let id = res.data[0].id;
				return this.getList(id);
			})
			.then(res=>{
				let id = res.data[0].id;
				return this.getComment(id);
			})
			.then(res=>{
				console.log(res);
			}).catch(err=>{
				console.log(err);
			})

1.4.2 封装多个对象

以上的案例多个请求之间存在依赖关系。

本节介绍同步执行的多个请求的案例。

给之前获取新闻列表和评论的请求写死入参就可以将上述的有前后关系的请求改为同步请求了。

			this.getNav().then(res=>{
				console.log("导航");
				console.log(res);
			});
			this.getList(51).then(res=>{
				console.log("列表");
				console.log(res);
			});
			this.getComment(251).then(res=>{
				console.log("评论");
				console.log(res);
			});

执行结果

观察发现,顺序不是导航->列表->评论。顺序没有按照同步的方式进行,因为这都是异步请求,且没有依赖关系。谁的请求速度快,谁得到了响应,谁就先执行。

可以看出,列表最先执行。当然再次刷新,顺序可能会改变,因为这跟网络请求有关。

场景:对于一个页面,不同请求数据的请求都在执行,需要等到所有数据都返回后再渲染页面。

实现如下。

			let p1 = this.getNav();
			let p2 = this.getList(51);
			let p3 = this.getComment(251);
			
			Promise.all([p1, p2, p3]).then(res=>{
				console.log(res);
			})

结果

按照顺序执行的结果。

all方法有助于页面加载时做一些操作。

1.5 async await异步处理同步化对代码重构

axios,很多地方用了then方法,说明它内部已经封装了Promise了,使用的时候直接调用即可。

uniapp,基本网络请求,大多数不支持then,都是在success回调的。

uniCloud,已经封装了Promise了。有两种方式:Promise方式和callback方式。

然后来看ES7,async和await。异步处理同步化。

这两个命令是成对出现的,如果使用await没有在函数中使用async命令,那就会报错。如果直接使用async没有使用await不会报错,只是返回的函数是个promise,可以,但是没有意义,所以这两个一起使用才会发挥出它们本身重要的作用。 

现在async和await满天飞,一些云处理,异步同步化,基本都是用await、async。

1.5.1 函数再改造

函数返回值必须是Promise对象,才能用await进行等待;如果不是Promise对象,根本无法使用await。

			let id, res;
			// 将函数的返回值定义为res变量
			// 函数返回值必须是Promise对象,才能用await进行等待
			// 如果不是Promise对象,根本无法使用await
			res = await this.getNav();
			console.log(res);
			id = res.data[0].id;
			res = await this.getList(id);
			console.log(res);
			id = res.data[2].id;
			res = await this.getComment(id);
			console.log(res);

结果

完整代码

<script>
	export default {
		data() {
			return {
				title: 'Hello'
			}
		},
		async onLoad() {
			let id, res;
			// 将函数的返回值定义为res变量
			// 函数返回值必须是Promise对象,才能用await进行等待
			// 如果不是Promise对象,根本无法使用await
			res = await this.getNav();
			console.log(res);
			id = res.data[0].id;
			res = await this.getList(id);
			console.log(res);
			id = res.data[2].id;
			res = await this.getComment(id);
			console.log(res);
		},
		methods: {
			// 获取导航列表,返回一个Promise对象
			getNav() {
				return new Promise((resolve, reject)=>{
					uni.request({
						url: 'https://ku.qingnian8.com/dataApi/news/navlist.php',
						success: res=> {
							resolve(res); 
						},
						fail: err=> {
							reject(err);
						}
					})
				})
				
			},
			// 获取新闻列表
			getList(id) {
				return new Promise ((resolve, reject)=>{
					uni.request({
						url: 'https://ku.qingnian8.com/dataApi/news/newslist.php',
						data: {
							cid: id
						},
						success: res=>{
							resolve(res);
						},
						fail: err=>{
							reject(err);
						}
					})
				})
			},
			// 获取当前新闻的评论
			getComment(id){
				return new Promise((resolve, reject)=>{
					uni.request({
						url: 'https://ku.qingnian8.com/dataApi/news/comment.php',
						data: {
							aid: id
						},
						success: res => {
							resolve(res);
						},
						fail:err=>{
							reject(err);
						}
					})
				})
			},
			getData(){
			  //获取分类列表id
			  uni.request({
				url:"https://ku.qingnian8.com/dataApi/news/navlist.php",
				success:res=>{
				  let id=res.data[0].id;
				  console.log(res);
				  // 根据分类id获取该分类下的所有文章
				  uni.request({
					url:"https://ku.qingnian8.com/dataApi/news/newslist.php",
					data:{
					  cid:id
					},
					success:res2=>{
					  //获取到一篇文章的id,根据文章id找到该文章下的评论
					  let id=res2.data[1].id;
					  console.log(res2);
					  uni.request({
						url:"https://ku.qingnian8.com/dataApi/news/comment.php",
						data:{
						  aid:id
						},
						success:res3=>{
						  //找到该文章下所有的评论
						  console.log(res3)
						}
					  })
					}
				  })
				}
			  })
			} 
		}
	}
</script>

1.6 总结

① 层层嵌套;

② 1.0版本,callback回调函数处理;

③ 2.0版本,返回Promise对象,使用then链式调用;调用方便++;

④ 3.0版本,ES7引入的async和await,让异步请求进行等待,然后将返回值赋给变量,进而去请求下一个内容。

目前,对于互相依赖型的请求,第③种使用的频率比较高。

⑤ 未来会有更好的方式...

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java 集合类的高级特性介绍

在 Java 编程中&#xff0c;了解集合类的高级特性对于编写高效和可维护的代码至关重要。以下是一些你应该知道的 Java 集合类的高级特性&#xff0c;以及简单的例子来说明它们的用法。 1. 迭代器&#xff08;Iterators&#xff09;和列表迭代器&#xff08;ListIterators&#…

算法归纳【数组篇】

目录 二分查找1. 前提条件&#xff1a;2. 二分查找边界 2.移除元素有序数组的平方长度最小的子数组59.螺旋矩阵II54. 螺旋矩阵 二分查找 参考链接 https://programmercarl.com/0704.%E4%BA%8C%E5%88%86%E6%9F%A5%E6%89%BE.html#%E6%80%9D%E8%B7%AF 1. 前提条件&#xff1a; 数…

git revert 撤回之前的几个指定的提交

文章目录 Intro操作命令-n 选项 参考 Intro 在开发过程中&#xff0c;有的时候一开始只是一个小需求&#xff0c;可以改着改着事情超出了控制&#xff0c;比如说我一开始只是想调整一个依赖包的版本&#xff0c;可是改到后来类库不兼容甚至导致项目无法启动。 这个时候我就想&…

华为OD机试 - 服务器广播 - 矩阵(Java 2024 C卷 200分)

目录 专栏导读一、题目描述二、输入描述三、输出描述1、输入2、输出3、说明 四、Java算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2024C卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷…

从数据到智能:探讨大数据在AI领域的核心作用

前言 大数据和人工智能已经成为当今社会的两大热门话题。它们之间究竟有何关系&#xff1f;又如何在各个领域发挥着重要作用&#xff1f; 概念区别与联系 一、大数据与人工智能的基本概念 大数据&#xff0c;顾名思义&#xff0c;指的是海量的、类型繁多的数据集合。这些数据…

万界星空科技MES系统中的车间管理的作用

在了解mes生产管理系统的作用包括哪些方面之前&#xff0c;我们先来了解一下作为生产管理信息化的关键部分&#xff0c;车间管理系统包含哪几个部分&#xff1a;一、mes系统中的车间管理通常包含以下部分&#xff1a; 1、设备管理&#xff1a;用于监控车间内的设备状态&#xf…

【日常聊聊】2024 年 AI 辅助研发趋势

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;日常聊聊 ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 方向一&#xff1a;AI辅助研发的技术进展 方向二&#xff1a;行业应用案例 方向三&#xff1a; 面临的挑战与机遇 方向四&a…

学习人工智能:吴恩达《AI for everyone》2019 第3周:实现智能音箱和自动驾驶的几个步骤;无监督学习;增强学习

吴恩达 Andrew Ng&#xff0c; 斯坦福大学前教授&#xff0c;Google Brain项目发起人、领导者。 Coursera 的联合创始人和联合主席&#xff0c;在 Coursera 上有十万用户的《机器学习》课程&#xff1b;斯坦福大学计算机科学前教授。百度前副总裁、前首席科学家&#xff1b;谷…

【深度优先】【图论】【C++算法】2045. 到达目的地的第二短时间

作者推荐 视频算法专题 LeetCode2045. 到达目的地的第二短时间 城市用一个 双向连通 图表示&#xff0c;图中有 n 个节点&#xff0c;从 1 到 n 编号&#xff08;包含 1 和 n&#xff09;。图中的边用一个二维整数数组 edges 表示&#xff0c;其中每个 edges[i] [ui, vi] 表…

开源分子对接程序rDock使用方法(1)-Docking in 3 steps

欢迎浏览我的CSND博客&#xff01; Blockbuater_drug …点击进入 文章目录 前言一、Docking in 3 steps 标准对接rDock 的基本对接步骤及注意事项 二、 三步对接案例Step 1. 结构文件准备Step 2. 产生对接位点Step 3. 运行分子对接3.1 检查输入文件3.2 测试-只进行打分3.3 运行…

Linux/Validation

Enumeration nmap 第一次扫描发现系统对外开放了22&#xff0c;80&#xff0c;4566和8080端口&#xff0c;端口详细信息如下 系统对外开放了4个端口&#xff0c;从nmap的结果来看&#xff0c;8080无法访问&#xff0c;手动尝试后4566也无法访问&#xff0c;只能从80端口开始 …

用MATLAB求解微分方程

第一篇为 基础概念 &#xff0c;第二篇为 R-K法的具体实现方法。 &#xff08;一&#xff09;常微分方程的MATLAB求解 概要&#xff1a; 常微分方程的MATLAB求解分为解析解、数值解解析解(只有少数微分方程组有解析解)&#xff1a;dsolve函数数值解&#xff1a;solver函数&a…

Python实例☞数据类型及运算符案例

实例一&#xff1a; ❶要求☞从键盘获取一个4位整数&#xff0c;并分别输出个、十、百、千位 ❷程序代码☞ ①第一种方法 print(请输入一个4位整数&#xff1a;) xeval(input()) print(个位数为&#xff1a;,x%10) print(十位数为&#xff1a;,(x//10)%10) print(百位数为&am…

Transformer中的FeedForward

Transformer中的FeedForward flyfish class PoswiseFeedForwardNet(nn.Module):def __init__(self, d_ff2048):super(PoswiseFeedForwardNet, self).__init__()# 定义一维卷积层 1&#xff0c;用于将输入映射到更高维度self.conv1 nn.Conv1d(in_channelsd_embedding, out_ch…

自律篇001-养成自律的秘密武器1-目标规划表

&#x1f680;以前在某书上看到一些博主非常自律&#xff0c;比如每天5点多起床看书&#xff0c;或者每天坚持健身&#xff0c;直到练出马甲线&#xff0c;还有一边工作一边考研等等&#xff0c;自己也曾尝试过做一些目标规划&#xff0c;但结果都不尽人意。写计划的时候往往信…

EVE-NG桥接虚拟网卡实现与虚拟机通讯

一、知识补充 1、VMware网络连接 在VM中&#xff0c;给我们提供了以下几种连接网络的模式 桥接模式&#xff1a;直接联机物理网络NAT模式&#xff1a;用于共享主机的IP地址仅主机模式&#xff1a;与主机共享的专用网络自定义&#xff1a;特定虚拟网络LAN区段 特别注意的是&am…

c++ 11 新特性 元组

一.元组介绍 C11引入了元组&#xff08;tuple&#xff09;这一新特性&#xff0c;它是一种可以存储不同类型元素的复合类型。元组类似于结构体&#xff0c;但更加灵活&#xff0c;因为它可以在运行时动态地创建和访问元素。 二.元组使用场景 C11中引入的元组&#xff08;tuple&…

css clip-path polygon属性实现直角梯形

2024.3.8今天我学习了如何用css实现直角梯形的效果&#xff0c; 效果&#xff1a; 具体实现原理&#xff1a; 一、需要三个div&#xff1a; 外面一个大的div&#xff0c;里面左右两个小的div 我们需要先把第一个div变成直角梯形&#xff1a; 大概是这样&#xff0c;设置好之…

ORA/GSA -- 学习记录

brief over-representation analysis(ORA),过表“达”分析&#xff0c;就是我们做多分组的RNAseq数据解析后会得到一些差异表达的gene&#xff0c;有些时候是单独拿出一个差异gene去解释表型&#xff0c;缺点是欠缺证据力度。有些人就把一些相关的差异gene放在一块儿解释&…

Extend继承

继承的作用 当我们定义了一个Person类&#xff1a; class Person{private Stirng name;private int age;public String getName(){....}public int getAge(){...}public void setName(String name){...}public void setAge(int age){...} }现在&#xff0c;假设还需要定义一个…