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

Promise详解大全:介绍、九个方法使用和区别、返回值详解

Promise的介绍

Promise是异步编程的一种解决方案,它的构造函数是同步执行的,then 方法是异步执行的,所以Promise创建后里面的函数会立即执行,构造函数中的resolve和reject只有第一次执行有效,,也就是说Promise状态一旦改变就不能再变

Promise的作用

     promise主要是用来解决回调地狱的问题,通过使用.then来使得代码成链式调用,方便维护和使用。.then中的回调函数属于异步任务中的微任务

Promise的状态

promise一共有3个状态:pending、fulfilled和rejected

pedding->初始状态:调用promise时,一开始就呈现出等待状态,遇到resolve或者reject之前,都处于这个状态,且可以改变,但如果确定了状态(fulfilled/reject),则结果将永远不变,不能再次修改

fulfilled->成功状态:在执行了resolve后,promise则会从pedding变成fulfilled,后续会进入.then 的回调函数中,在回调函数的第一个参数函数中可以获取到值

rejected->失败状态:在执行了reject后,promise状态会变成rejected,rejected函数传递的参数,可以在.then的第二个参数函数中获取的到,或者是在.catch获取到,但是如果程序上的错误,得通过.catch函数去拿到失败消息,在.then中是获取不了的

Promise的九个方法

Promise.resolve

    这个Promise对象的静态方法,用于创建一个成功状态的Promise对象,可以之间在.then的成功回调中,获取resolve的值
const p = Promise.resolve("成功");
p.then((res) => {console.log("----打印:", res); //----打印: 成功
});//该用法类似于
const p1 = new Promise((resolve, reject) => {resolve("成功");
});
p1.then((res) => {console.log("----打印:p1", res); //----打印:p1 成功
});//后续代码中都会出现类似,或者另外中写法,尝试的时候,不能同时放出来执行

Promise.reject

    这个方法跟Promise.resolve一样,只是作用不同,属于拒绝的状态;可以直接在.then的失败回调中,获取reject的值;也可以在.catch中获取;如果两者同时出现代码中,看看是catch写在前面还是.then函数写在前面 **---业务中,拒绝状态用.then去执行回调,异常用.catch**
const p = Promise.reject("失败");
p.then((res) => {console.log("----打印:", res); //不执行},(rej) => {console.log("----打印:", rej); //----打印: 失败}
);//另外写法 
p.then((res) => {console.log("----打印:p", res); //不执行},(rej) => {console.log("----打印:p", rej); //----打印:p 失败}
).catch((error) => {console.log("----打印:catch", error); //不执行
});//另外写法---基本没有吧catch写在第一个
p.catch((error) => {console.log("----打印:catch", error); //----打印:catch 失败
}).then((res) => {console.log("----打印:p", res); //不执行},(rej) => {console.log("----打印:p", rej); //不执行}
);//另外写法
p.then((res) => {console.log("----打印:p", res); //不执行
}).catch((error) => {console.log("----打印:catch", error); //----打印:catch 失败
});//该用法类似于
const p1 = new Promise((resolve, reject) => {reject("失败");
});
p1.then((res) => {console.log("----打印:p1", res); //不执行},(rej) => {console.log("----打印:p1", rej); //----打印:p1 失败}
);

Promise.then

    函数回调执行,常用于接收请求接口返回的数据;该回调函数有**两个参数(函数)**,一个是用于处理 Promise 解决时的回调函数,另一个是可选的用于处理 Promise 拒绝(rejected)时的回调函数;用于接收promise对应状态的数据。而且**.then的返回值也是个promis对象**,具体看后面返回值详解章节
const p = new Promise((resolve, reject) => {resolve("成功");
});
const result = p.then((res) => {console.log("----打印:p", res); //----打印:p 成功},(rej) => {console.log("----打印:p", rej); //不执行}
);
result.then((res) => {console.log("----打印:第二次", res); //----打印:第二次 undefinedconsole.log("----打印:", result); //----打印: Promise { <fulfilled> } --    [PromiseState]]: "fulfilled"[[PromiseResult]]: undefined//为啥呢?//因为第一个then没有给返回的具体值--,所以在第二个.then中,//剥离掉promise,拿到的result就是undefined//虽然.then返回值是promise,但.then里面的参数,拿到的是promise里面携带的值(通俗表达)},(rej) => {console.log("----打印:第二次", rej); //不执行}
);//这个是最先打印--所以执行这里的时候,显示还是在pedding状态
console.log("----打印:", result); //----打印: Promise { <pending> } --[PromiseState]]: "fulfilled"[[PromiseResult]]: undefined//若这么写。第二个then函数中拿到值就是6,而不是undefinedconst result = p.then((res) => {console.log("----打印:p", res); //----打印:p 成功return 6},);result.then((res) => {console.log("----打印:第二次", res); //----打印:第二次 6},);
   **Tips:注意,如果.then中写了参数不是函数,则会变成promise穿透哦!**
const p = new Promise((resolve, reject) => {resolve("成功");
});
const result = p.then(Promise.resolve("传不过去")); //不是函数
result.then((res) => {console.log("----打印:", res); //----打印: 成功
});
//相当于这中写法
const result1 = p.then(null); //不是函数
result1.then((res) => {console.log("----打印:", res); //----打印: 成功
});
//也可以写成链式调用,结果一样的
p.then(null).then((res) => {console.log("----打印:", res); //----打印: 成功
});

Promise.catch

    用于注册在 Promise 对象拒绝(rejected)时的回调函数。同时也可以用来**捕获代码异常**或者出错;**1、**像如果promise是一个reject的状态或者抛出异常或者错误,既可以在.then函数中的第二个参数获取,也可以在.catch中的函数中获取,如果两者同时出现代码中(可以看Promise.reject中的案例哦)。

**2、**.then中产生异常能在.catch 或者下一个.then中捕获。.then.catch本质上是没有区别的, 需要分场合使用;一般异常用.catch。拒绝状态用.then

  **3、**而且,一旦异常被捕获,则未执行后面中的.then不管多少,都不会执行。**一般最好用.catch 在最后去捕获**,这样能捕获到上面最先报错的信息
const p = new Promise((resolve, reject) => {reject("拒绝");console.log("----打印:"); //会输出throw new Error("抛出错误"); //这一句改变promise状态,因为状态已经决定了
});
p.catch((error) => {console.log(error); // :--拒绝
});// 另外写法
p.then((res) => {},(rej) => {console.log("----打印:", rej); //----打印: 拒绝}
);//另外情况
const p1 = new Promise((resolve, reject) => {throw new Error("抛出错误");
});p1.catch((error) => {console.log("p1", error); //:Error: 抛出错误
});//另外情况---2
const p2 = new Promise((resolve, reject) => {resolve(11);
});p2.then((res) => {console.log("----打印:", res);throw new Error("抛出错误");
})//如果没有下面这个.then 则错误就会被catch捕获//不提倡这种写法--只是为了证明,then也可以接收到异常.then((res) => {},(rej) => {console.log("----打印:能接到就执行", rej); //----打印:能接到就执行 Error: 抛出错误}).catch((error) => {console.log("catch接到", error); //不执行});//另外的情况3
const p3 = new Promise((resolve, reject) => {resolve(11);
});p3.then((res) => {console.log("----打印:", res);throw new Error("抛出错误");
})//如果没有下面这个.then 则错误就会被catch捕获//一般是直接在最后写.catch,而不会这么一层层写reject回调函数,除非特殊业务.then((res) => {},(rej) => {console.log("----打印:rej", rej); //执行}).then((res) => {},(rej) => {console.log("----打印:会不会执行"); //不会执行}).catch((error) => {console.log("catch接到", error); //不执行});

Promise.all

    Promise.all接收一个**promise对象的数组**作为参数,当这个数组里面的promise对象,没有出现rejected状态,则会一直等待所有resolve成功后,才执行.then这个回调,如果有一个是rejected状态,则会先执行.all里面的.then中第二个回调函数或者.catch函数,不会等后续跑完你在执行传递给Promise.all的 promise并不是一个个的顺序执行的,而是**同时开始、并行执行**的  
var p1 = new Promise((resoleve, reject) => {setTimeout(() => {resoleve("p1--3000");}, 3000);
});
var p2 = new Promise((resoleve, reject) => {setTimeout(() => {resoleve("p2--1000");}, 1000);
});
var p3 = new Promise((resoleve, reject) => {setTimeout(() => {console.log("----打印:看看是先执行失败,还是全部执行完再catch");resoleve("p3--5000");}, 5000);
});//第一情况var promiseArr = [p1, p2, p3];console.time("promiseArr");Promise.all(promiseArr).then((res) => {console.log("res", res); //res [ 'p1--3000', 'p2--1000', 'p3--5000' ]console.timeEnd("promiseArr"); // promiseArr: 5.020s}).catch((err) => console.log(err));//另外情况
var p4 = new Promise((resoleve, reject) => {setTimeout(() => {reject("p4--2000");}, 2000);
});var promiseArr = [p1, p2, p3, p4];
console.time("promiseArr");
Promise.all(promiseArr).then((res) => {console.log("res", res);console.timeEnd("promiseArr");}).catch((err) => console.log(err)); //打印顺序
//p4--2000
//输出----打印:看看是先执行失败,还是全部执行完再catch //解释:p3的输出,比上边catch晚输出因此,如果有失败状态,就会提前结束、去执行all里面的回调函数

Promise.any

    Promise.any接收一个promise的数组作为参数,只要**其中有一个`Promise`成功执行**,**就会返回已经成功执行的`Promise`**的结果;**若全部为rejected状态**,**则会到最后的promise执行完,全部的promise返回到异常函数中**;可用于多通道获取数据,谁先获取就执行下一步程序,跳出这个过程。---和all的相反
var p1 = new Promise((resoleve, reject) => {setTimeout(() => {resoleve("p1--3000");}, 3000);
});
var p2 = new Promise((resoleve, reject) => {setTimeout(() => {reject("p2--1000");}, 1000);
});
var p3 = new Promise((resoleve, reject) => {setTimeout(() => {console.log("----打印p3");resoleve("p3--5000");}, 5000);
});var promiseArr = [p1, p2, p3];
console.time("promiseArr");
Promise.any(promiseArr).then((res) => {console.log("res", res); //res [ 'p1--3000', 'p2--1000', 'p3--5000' ]console.timeEnd("promiseArr"); // promiseArr: 5.020s}).catch((err) => console.log(err));//输出顺序 --虽然p2已经执行完,但是为rejected状态,而any会返回第一个resolve状态的对象
//   res p1--3000
// promiseArr: 3.009s
// ----打印p3//另外一种情况
var p1 = new Promise((resoleve, reject) => {setTimeout(() => {reject("p1--3000");}, 3000);
});
var p2 = new Promise((resoleve, reject) => {setTimeout(() => {reject("p2--1000");}, 1000);
});
var p3 = new Promise((resoleve, reject) => {setTimeout(() => {console.log("----打印p3");reject("p3--5000");}, 5000);
});var promiseArr = [p1, p2, p3];
console.time("promiseArr");
Promise.any(promiseArr).then((res) => {console.log("res", res); //res [ 'p1--3000', 'p2--1000', 'p3--5000' ]console.timeEnd("promiseArr"); // promiseArr: 5.020s}).catch((err) => console.log(err));//输出结果   解释--因为p1,2,3都是错误,所以any一直在等有成功的状态,所以知道p3结束后,没有成功的,就走catch那边
// ----打印p3
// [AggregateError: All promises were rejected] {
//   [errors]: [ 'p1--3000', 'p2--1000', 'p3--5000' ]
// }

Promise.race

    方法接收的参数和.all、.any接收的参数一样,接收一个可迭代promise对象的数组,**当任何一个promise的状态先确定(拒绝或者成功),则会执行.race中的回调函数**,具体根据promise的状态 ---和allSettled效果互斥
var p1 = new Promise((resoleve, reject) => {setTimeout(() => {console.log("----打印:p1");resoleve("p1--3000");}, 3000);
});let p2 = new Promise((resoleve, reject) => {setTimeout(() => {reject("p2--1000");}, 1000);
});Promise.race([p1, p2]).then((res) => {console.log("----打印:res", res);}).catch((err) => {console.log("----打印:err", err);});//执行结果
//----打印:err p2--1000
//----打印:p1//另外情况let p3 = new Promise((resoleve, reject) => {setTimeout(() => {resoleve("p3--500");}, 500);
});Promise.race([p1, p2, p3]).then((res) => {console.log("----打印:res", res);}).catch((err) => {console.log("----打印:err", err);});//打印结果
// ----打印:res p3--500
// ----打印:p1

Promise.allSettled

    该方法参数也是和.all相同;顾名思义,这个方法是**等所有promise参数确定状态后,才会执行回调函数**,不管是成功的状态还是拒绝的状态,都等待全部执行后,并返回一个包含每个 Promise 解决状态的对象数组,**每个对象包含两个属性:`status` 和** `**value**;state表示promise的状态:resolve和rejected,value代表的是promise传递的值。`

请注意,Promise.allSettled 是 ES2020(也称为 ES11)中引入的新方法,需要支持该版本的 JavaScript 运行环境才能使用

var p1 = new Promise((resoleve, reject) => {setTimeout(() => {console.log("----打印:p1");resoleve("p1--3000");}, 3000);
});let p2 = new Promise((resoleve, reject) => {setTimeout(() => {reject("p2--1000");}, 1000);
});let p3 = new Promise((resoleve, reject) => {setTimeout(() => {resoleve("p3--500");}, 500);
});let p4 = new Promise((resolve, reject) => {throw new Error("抛出错误");
});Promise.allSettled([p1, p2, p3, p4]).then((result) => {console.log("----打印:result", result);}).catch((err) => {console.log("----打印:", err); //不执行});//执行结果
// ----打印:p1
// ----打印:result [
//   { status: 'fulfilled', value: 'p1--3000' },
//   { status: 'rejected', reason: 'p2--1000' },
//   { status: 'fulfilled', value: 'p3--500' },
//   {
//     status: 'rejected',
//     reason: Error: 抛出错误
//   }
// ]

Promise.finally

Promise.finally方法的回调函数不接受任何参数 这表明,finally方法里面的操作,应该是Promise状态无关的,无论 Promise 的状态如何,onFinally 回调都会被执行。它不接收任何参数,也没有返回值。这意味着它主要用于清理和最终处理逻辑,而不关心 Promise 的解决结果或拒绝原因。

var p1 = new Promise((resoleve, reject) => {setTimeout(() => {resoleve("p1--3000");}, 3000);
});p1.then((res) => {console.log("----打印:", res);
}).finally(() => {console.log("----打印:调用了");
});// //执行结果
// // ----打印: p1--3000
// // ----打印:调用了
let p2 = new Promise((resoleve, reject) => {setTimeout(() => {reject("p2--1000");}, 1000);
});p2.then((res) => {}).catch((err) => {console.log("----打印:", err);}).finally(() => {console.log("----打印:也调用了");});//执行结果
//   ----打印: p2--1000
// ----打印:也调用了

Promise的返回值 — promise对象

new Promise 的返回值是什么?

    返回值是一个**promise对象**,对象中的状态和值,根据new promise中同步代码的逻辑决定
let resolveP = new Promise((resolve, resject) => {resolve("success");
});
console.log("----打印:", resolveP);
//执行结果
//----打印: Promise {<fulfilled>: 'success'}
let rejectP = new Promise((resolve, resject) => {resject("rejected");
});
console.log("----打印:", rejectP);//执行结果
// Promise {<rejected>: 'rejected'}

promise.then 的返回值是什么?

  1. 当函数中没有return值的时候,或者return的是个普通数据,返回的值是一个promise对象,对象中有成功状态,和undefined的值。

    let p = new Promise((resoleve, reject) => {setTimeout(() => {resoleve("返回值");}, 1000);
    });const backP = p.then((res) => {console.log("----打印:res", res);
    });
    const finallyBackP = backP.then((res) => {return "又有数据";
    });
    setTimeout(() => {console.log("----打印:backP", backP);
    }, 2000);
    setTimeout(() => {console.log("----打印:finallyBackPP", finallyBackP);
    }, 3000);//执行结果
    // ----打印:res 返回值
    // ----打印:backP Promise {<fulfilled>: undefined}
    //----打印:finallyBackPP Promise {<fulfilled>: '又有数据'}
    
  2. 当函数中return的是一个promise对象,则返回值依旧是一个promise对象,注意:此时的promise状态和return的promise对象中的状态一致

    let p = new Promise((resoleve, reject) => {setTimeout(() => {resoleve("返回值");}, 1000);
    });const backP = p.then((res) => {console.log("----打印:", res);return Promise.resolve(res + "成功的promise");
    });
    const finallyBackP = backP.then((res) => {console.log("----打印:", res);return Promise.reject("最后是失败的promise");
    });
    setTimeout(() => {console.log("----打印:backP", backP);
    }, 2000);
    setTimeout(() => {console.log("----打印:finallyBackPP", finallyBackP);
    }, 3000);//执行结果
    // ----打印: 返回值
    // ----打印: 返回值成功的promise
    // ----打印:backP Promise {<fulfilled>: '返回值成功的promise'}
    // ----打印:finallyBackPP Promise {<rejected>: '最后是失败的promise'}
    
  3. 当函数中报错,抛出错误,则返回值是一个拒绝状态的promise对象

    let p = new Promise((resoleve, reject) => {setTimeout(() => {resoleve("返回值");}, 1000);
    });const backP = p.then((res) => {console.log("----打印:", res);throw new Error("程序错误");
    });setTimeout(() => {console.log("----打印:backP", backP);
    }, 2000);//打印结果
    //----打印: 返回值
    // ----打印:backP Promise {<rejected>: Error: 程序错误//另外情况
    //一般业务中,promise最后都会用.catch兜住,防止程序出错,这种写法的返回值,则跟情况一相同let p = new Promise((resoleve, reject) => {setTimeout(() => {resoleve("返回值");}, 1000);
    });const backP = p.then((res) => {console.log("----打印:", res);throw new Error("程序错误");}).catch((error) => {console.log("----打印:", error);});setTimeout(() => {console.log("----打印:backP", backP);
    }, 2000);//打印结果//----打印: 返回值
    //----打印: Error: 程序错误  at <anonymous>:10:11
    // ----打印:backP Promise {<fulfilled>: undefined}
    

    Tips:这篇主要写promise具体使用和注意点,较少涉及原理性知识,如有什么错误,请多多指出,若觉得不错,可点赞收藏,谢谢支持!!!

相关文章:

Promise详解大全:介绍、九个方法使用和区别、返回值详解

Promise的介绍 Promise是异步编程的一种解决方案&#xff0c;它的构造函数是同步执行的&#xff0c;then 方法是异步执行的&#xff0c;所以Promise创建后里面的函数会立即执行&#xff0c;构造函数中的resolve和reject只有第一次执行有效&#xff0c;&#xff0c;也就是说Pro…...

尚硅谷爬虫note004

一、urllib库 1. python自带&#xff0c;无需安装 # _*_ coding : utf-8 _*_ # Time : 2025/2/11 09:39 # Author : 20250206-里奥 # File : demo14_urllib # Project : PythonProject10-14#导入urllib.request import urllib.request#使用urllib获取百度首页源码 #1.定义一…...

Debezium系列之:时区转换器,时间戳字段转换到指定时区

Debezium系列之:时区转换器,时间戳字段转换到指定时区 示例:基本配置应用TimezoneConverter SMT的效果示例:高级配置配置选项当Debezium发出事件记录时,记录中的时间戳字段的时区值可能会有所不同,这取决于数据源的类型和配置。为了在数据处理管道和应用程序中保持数据一…...

ubuntu20.04声音设置

step1&#xff1a;打开pavucontrol&#xff0c;设置Configuration和Output Devices&#xff0c; 注意需要有HDMI / DisplayPort (plugged in)这个图标。如果没有&#xff0c;就先选择Configuration -> Digital Stereo (HDMI 7) Output (unplugged) (unvailable)&#xff0c;…...

如何设置Python爬虫的User-Agent?

在Python爬虫中设置User-Agent是模拟浏览器行为、避免被目标网站识别为爬虫的重要手段。User-Agent是一个HTTP请求头&#xff0c;用于标识客户端软件&#xff08;通常是浏览器&#xff09;的类型和版本信息。通过设置合适的User-Agent&#xff0c;可以提高爬虫的稳定性和成功率…...

深度学习框架探秘|TensorFlow:AI 世界的万能钥匙

在人工智能&#xff08;AI&#xff09;蓬勃发展的时代&#xff0c;各种强大的工具和框架如雨后春笋般涌现&#xff0c;而 TensorFlow 无疑是其中最耀眼的明星之一。它不仅被广泛应用于学术界的前沿研究&#xff0c;更是工业界实现 AI 落地的关键技术。今天&#xff0c;就让我们…...

C++:高度平衡二叉搜索树(AVLTree) [数据结构]

目录 一、AVL树 二、AVL树的理解 1.AVL树节点的定义 2.AVL树的插入 2.1更新平衡因子 3.AVL树的旋转 三、AVL的检查 四、完整代码实现 一、AVL树 AVL树是什么&#xff1f;我们对 map / multimap / set / multiset 进行了简单的介绍&#xff0c;可以发现&#xff0c;这几…...

建筑兔零基础自学python记录18|实战人脸识别项目——视频检测07

本次要学视频检测&#xff0c;我们先回顾一下图片的人脸检测建筑兔零基础自学python记录16|实战人脸识别项目——人脸检测05-CSDN博客 我们先把上文中代码复制出来&#xff0c;保留红框的部分。 ​ 然后我们来看一下源代码&#xff1a; import cv2 as cvdef face_detect_demo(…...

【MySQL数据库】Ubuntu下的mysql

目录 1&#xff0c;安装mysql数据库 2&#xff0c;mysql默认安装路径 3&#xff0c;my.cnf配置文件? 4&#xff0c;mysql运用的相关指令及说明 5&#xff0c;数据库、表的备份和恢复 mysql是一套给我们提供数据存取的&#xff0c;更加有利于管理数据的服务的网络程序。下…...

[MySQL#1] database概述 常见的操作指令 MySQL架构 存储引擎

#1024程序员节&#xff5c;征文# 目录 一. 数据库概念 0.连接服务器 1. 什么是数据库 口语中的数据库 为什么数据不直接以文件形式存储&#xff0c;而需要使用数据库呢&#xff1f; 总结 二. ??基础操作 三. 主流数据库 四. 基础知识 服务器&#xff0c;数据库&…...

1.从零开始学会Vue--{{基础指令}}

全新专栏带你快速掌握Vue2Vue3 1.插值表达式{{}} 插值表达式是一种Vue的模板语法 我们可以用插值表达式渲染出Vue提供的数据 1.作用&#xff1a;利用表达式进行插值&#xff0c;渲染到页面中 表达式&#xff1a;是可以被求值的代码&#xff0c;JS引擎会将其计算出一个结果 …...

VS2022中.Net Api + Vue 从创建到发布到IIS

VS2022中.Net Api Vue 从创建到发布到IIS 前言一、先决条件二、创建项目三、运行项目四、增加API五、发布到IIS六、设置Vue的发布 前言 最近从VS2019 升级到了VS2022,终于可以使用官方的.Net Vue 组合了,但是使用过程中还是有很多问题,这里记录一下. 一、先决条件 Visual …...

RFID技术在制造环节的应用与价值

在现代制造业中&#xff0c;信息化和智能化已经成为企业提升竞争力的重要手段。RFID技术因其非接触式、远距离和高效识别的特点&#xff0c;广泛应用于生产的多个环节。本文将详细解读生产过程中RFID的关键应用场景&#xff0c;并结合实际案例&#xff0c;展示其为制造业带来的…...

(前端基础)HTML(一)

前提 W3C:World Wide Web Consortium&#xff08;万维网联盟&#xff09; Web技术领域最权威和具有影响力的国际中立性技术标准机构 其中标准包括&#xff1a;机构化标准语言&#xff08;HTML、XML&#xff09; 表现标准语言&#xff08;CSS&#xff09; 行为标准&#xf…...

Linux文件管理:硬链接与软链接

文章目录 1. 硬链接的设计目的&#xff08;1&#xff09;节省存储空间&#xff08;2&#xff09;提高文件管理效率&#xff08;3&#xff09;数据持久性&#xff08;4&#xff09;文件系统的自然特性 2. 软链接的设计目的**&#xff08;1&#xff09;跨文件系统引用****&#x…...

pnpm, eslint, vue-router4, element-plus, pinia

利用 pnpm 创建 vue3 项目 pnpm 包管理器 - 创建项目 Eslint 配置代码风格(Eslint用于规范纠错&#xff0c;prettier用于美观&#xff09; 在 设置 中配置保存时自动修复 提交前做代码检查 husky是一个 git hooks工具&#xff08;git的钩子工具&#xff0c;可以在特定实际执行特…...

在软件产品从开发到上线过程中,不同阶段可能出现哪些问题,导致软件最终出现线上bug

在软件产品从开发到上线的全生命周期中&#xff0c;不同阶段都可能因流程漏洞、技术疏忽或人为因素导致线上问题。以下是各阶段常见问题及典型案例&#xff1a; 1. 需求分析与设计阶段 问题根源&#xff1a;业务逻辑不清晰或设计缺陷 典型问题&#xff1a; 需求文档模糊&#…...

Spring Boot中如何自定义Starter

文章目录 Spring Boot中如何自定义Starter概念和作用1. 概念介绍2. 作用和优势2.1 简化依赖管理2.2 提供开箱即用的自动配置2.3 标准化和模块化开发2.4 提高开发效率2.5 提供灵活的配置覆盖3. 应用场景创建核心依赖1. 确定核心依赖的作用2. 创建 starter-core 模块2.1 依赖管理…...

制作Ubuntu根文件

系列文章目录 Linux内核学习 Linux 知识&#xff08;1&#xff09; Linux 知识&#xff08;2&#xff09; WSL Ubuntu QEMU 虚拟机 Linux 调试视频 PCIe 与 USB 的补充知识 vscode 使用说明 树莓派 4B 指南 设备驱动畅想 Linux内核子系统 Linux 文件系统挂载 QEMU 通过网络实现…...

SpringBoot快速接入OpenAI大模型(JDK8)

使用AI4J快速接入OpenAI大模型 本博文给大家介绍一下如何使用AI4J快速接入OpenAI大模型&#xff0c;并且如何实现流式与非流式的输出&#xff0c;以及对函数调用的使用。 介绍 由于SpringAI需要使用JDK17和Spring Boot3&#xff0c;但是目前很多应用依旧使用的JDK8版本&…...

CTF show Web 红包题第六弹

提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框&#xff0c;很难让人不联想到SQL注入&#xff0c;但提示都说了不是SQL注入&#xff0c;所以就不往这方面想了 ​ 先查看一下网页源码&#xff0c;发现一段JavaScript代码&#xff0c;有一个关键类ctfs…...

Spark 之 入门讲解详细版(1)

1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室&#xff08;Algorithms, Machines, and People Lab&#xff09;开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目&#xff0c;8个月后成为Apache顶级项目&#xff0c;速度之快足见过人之处&…...

ETLCloud可能遇到的问题有哪些?常见坑位解析

数据集成平台ETLCloud&#xff0c;主要用于支持数据的抽取&#xff08;Extract&#xff09;、转换&#xff08;Transform&#xff09;和加载&#xff08;Load&#xff09;过程。提供了一个简洁直观的界面&#xff0c;以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明

AI 领域的快速发展正在催生一个新时代&#xff0c;智能代理&#xff08;agents&#xff09;不再是孤立的个体&#xff0c;而是能够像一个数字团队一样协作。然而&#xff0c;当前 AI 生态系统的碎片化阻碍了这一愿景的实现&#xff0c;导致了“AI 巴别塔问题”——不同代理之间…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)

宇树机器人多姿态起立控制强化学习框架论文解析 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架&#xff08;一&#xff09; 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...

Matlab | matlab常用命令总结

常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...

docker 部署发现spring.profiles.active 问题

报错&#xff1a; org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...

Yolov8 目标检测蒸馏学习记录

yolov8系列模型蒸馏基本流程&#xff0c;代码下载&#xff1a;这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中&#xff0c;**知识蒸馏&#xff08;Knowledge Distillation&#xff09;**被广泛应用&#xff0c;作为提升模型…...

逻辑回归暴力训练预测金融欺诈

简述 「使用逻辑回归暴力预测金融欺诈&#xff0c;并不断增加特征维度持续测试」的做法&#xff0c;体现了一种逐步建模与迭代验证的实验思路&#xff0c;在金融欺诈检测中非常有价值&#xff0c;本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...

认识CMake并使用CMake构建自己的第一个项目

1.CMake的作用和优势 跨平台支持&#xff1a;CMake支持多种操作系统和编译器&#xff0c;使用同一份构建配置可以在不同的环境中使用 简化配置&#xff1a;通过CMakeLists.txt文件&#xff0c;用户可以定义项目结构、依赖项、编译选项等&#xff0c;无需手动编写复杂的构建脚本…...