Promise详解、自定义

这里写目录标题

    • 一、.Promise对象详解
      • 1. Promise是什么
      • 2. Promise的优点
      • 3. 异步编程
      • 4. then(onFulfilled, onRejected):
      • 5. util.promisify 方法:
      • 6. promise的状态改变
      • 7.Promise 对象的值
      • 8. Promise的基本执行流程
      • 9. Promise的API
      • 10. Promise中的关键问题
    • 二、Promise的自定义封装
      • 1. 定义执行器函数
      • 2. 通过throw抛出异常改变状态
      • 3. 状态只能修改一次
      • 4. then方法实现
      • 5. 异步任务 then 方法的实现(保存回调函数)
      • 6.指定多个回调(callback为数组)
      • 7.改写同步任务then返回结果为promise对象
      • 8.异步任务,改写then返回结果为promise
      • 9. 优化代码
      • 10. catch方法与异常穿透
      • 11. 实现Promise.resolve()
      • 12. 实现Promise.all()
      • 13. 实现Promise.race()方法
      • 14. then()是异步执行的
      • 15. 完整代码
      • 16. class版本
    • 三、async和await
      • 1. async 函数
      • 2. await表达式
      • 3. async和await结合的实例一:文件读取
      • 4. async和await结合实例二:AJAX

一、.Promise对象详解

1. Promise是什么

  • 是JS中进行异步编程的新解决方案(旧方案是用回调函数)
  • 语法:Promise是一个构造函数
  • 功能:Promise对象用来封装一个异步操作并获取其成功或者失败的结果值

2. Promise的优点

  • 支持链式调用,可以解决回调地狱问题
    • 回调地狱:回调函数的嵌套调用
    • 回调地狱的缺点:不便于阅读,不便于异常处理(无法精确定位是哪一个回调函数出了问题)

3. 异步编程

  • fs文件操作
  • 数据库
  • AJAX
  • 定时器

4. then(onFulfilled, onRejected):

用于指定Promise对象成功或者失败的回调函数

  • onFullfilled:成功回调函数

  • onRejected:失败回调函数

  • 实例一:读取文件

    const fs = require('fs')
    //原始方法
    // fs.readFile('./resource/content.txt', (err, data) => {
    //     if (err) throw err;
    //     console.log(data.toString());// })// Promise形式
    const p = new Promise((resolve, reject) => {fs.readFile('./resource/content1.txt', (err, data) => {if (err) reject(err);resolve(data)})
    })//调用then指定失败和成功执行的函数
    p.then((value) => {console.log(value.toString())
    }, (reason) => {console.log(reason);})
    
  • 实例二:AJAX请求

                const p = new Promise((resolve, reject) => {//1.创建对象const xhr = new XMLHttpRequest();//2.初始化xhr.open('GET', "https://api.apiopen.top/getJoke")//3.发送xhr.send()//4.处理响应结果xhr.onreadystatechange = function () {if (xhr.readyState === 4) {if (xhr.status >= 200 && xhr.status < 300) {// console.log(xhr.response);resolve(xhr.response)} else {// console.log(xhr.status);reject(xhr.status)}}}})p.then((value) => {console.log(value);}, (reason) => {console.warn(reason);})
    
  • 实例三:封装文件请求函数返回值为一个promise对象

    function mineReadFile(path) {return new Promise((resolve, reject) => {require('fs').readFile(path, (err, data) => {if (err) reject(err)resolve(data)})})
    }mineReadFile('./resource/content.tx').then((value) => {console.log(value.toString());}, (reason) => {console.log(reason);})
    

5. util.promisify 方法:

传入一个错误优先的函数((err,value)=>....),返回一个promise

const util = require('util')
const fs = require('fs')
const { log } = require('console')//返回一个新函数
let mineReadFile = util.promisify(fs.readFile)mineReadFile('./resource/content.txt').then(value => {console.log(value.toString())
}
)

6. promise的状态改变

  • 状态:实例对象中的属性【PromiseState】

  • 三种值:pending, resolved, rejected

  • pending=>resolved

  • pending=>rejected

  • 只能改变一次,通过resolvereject和抛出异常方法改变

7.Promise 对象的值

  • 实例对象中的一个属性【PromiseResult】,保存对象【成功、失败】的结果
  • 只有 resolve 和 reject 函数可以改变这个值

8. Promise的基本执行流程

在这里插入图片描述

9. Promise的API

  1. Promise的构造函数:Promise(executor){}

    • executor 函数:执行器 (resolve, reject)=>{}同步调用,异步操作在执行器内执行
    • resolve 函数:内部定义成功时调用的函数 value=>{}
    • reject 函数:内部定义失败时调用的函数 reason=>{}
  2. Promise.prototype.then(onResolved, onRejected)

    • onResolved 函数:成功的回调函数value=>{}
    • onRejected 函数:失败的回调函数 reason=>{}
    • 说明:返回一个新的Promise对象
  3. Promise.prototype.catch(onRejected)

  4. Promise.resolve()

           //如果传入的参数为非Promise对象,则返回为成功的Promise对象let p1 = Promise.resolve(521);//如果传入参数为Promise对象,则参数结果决定了resolve的结果let p2 = Promise.resolve(new Promise((resolve, reject) => {reject('Error')}))p2.catch(reason => {console.log(reason);})console.log(p2);

    在这里插入图片描述
    5. Promise.reject():返回一个失败对象
    6. Promise.all(promise数组) 返回一个新的 Promise对象,只有所有promise都成功,才成功,只要有一个失败了就直接失败

           let p1 = new Promise((resolve, reject) => {resolve('ok')})let p2 = Promise.resolve('Success')let p3 = Promise.resolve('Oh Yeah')const result = Promise.all([p1, p2, p3])console.log(result);


7. Promise.race(promise数组):返回一个新的Promise,第一个完成的promise的结果状态就是最终状态

10. Promise中的关键问题

  1. 如何改变promise的状态

    • resolve(value):如果当前是pending就会变成resovled

    • reject(reason):如果当前是pending就会变成rejected

    • 抛出异常:如果当前是pending就会变成rejected

                  const p = new Promise((resolve, reject) => {throw 'ERROR'})console.log(p);
      


    在这里插入图片描述

  2. 一个promise指定多个成功/失败回调函数,都会调用吗

    是的,都会调用

  3. 改变promise状态和then()执行,谁先谁后

    (1)都有可能,一般情况下是先指定回调函数再改变状态,但是也可以先改状态再指定回调

    (2)如何先改状态再指定回调?

    • 在执行器中直接调用resolve()/rejecte()
    • 延迟更长时间才调用then()

    (3)什么时候才能执行成功或者失败回调函数

    • 当状态改变时

  4. promise.then()返回新的promise的结果是由什么决定的?

    • 如果返回是非promise值,则返回状态为resolved,值为value的promise对象
    • 如果返回是一个新的promise,则此promise的结果就是then()返回的结果
    • 如果抛出异常,则返回状态为rejected,值为reason的promise对象
  5. promise如何串联多个操作任务

            let p = new Promise((resolve, reject) => {setTimeout(() => {resolve('OK')}, 1000)})p.then((value) => {return new Promise((resolve, reject) => {resolve('success')})}).then((value) => {console.log(value)}).then(value => {console.log(value);})
    

    输出结果:在这里插入图片描述

  6. promise异常穿透

            let p = new Promise((resolve, reject) => {setTimeout(() => {resolve('OK')}, 1000)})p.then((value) => {return new Promise((resolve, reject) => {reject('err')})}).then((value) => {throw '失败'}).then(value => {console.log(value);}).catch((reason) => {console.warn(reason)})//输出err
    
  7. 如何中断promise链

    在回调函数中返回一个pendding状态的promise对象

            let p = new Promise((resolve, reject) => {setTimeout(() => {resolve('OK')}, 1000)})p.then((value) => {console.log(111);//有且只有一种方法return new Promise(() => { })}).then((value) => {console.log(222);}).then(value => {console.log(333);}).catch((reason) => {console.warn(reason)})//输出111
    

二、Promise的自定义封装

1. 定义执行器函数

function Promise(executor) {//定义Promise对象的属性this.PromiseState = 'pending'this.PromiseResult = null//保留实例对象的this的值const self = this//resolve函数function resolve(data) {self.PromiseState = 'fulfilled'self.PromiseResult = data}//reject函数function reject(data) {self.PromiseState = 'rejected'self.PromiseResult = data}//同步调用[执行器函数]executor(resolve, reject)}

2. 通过throw抛出异常改变状态

function Promise(executor) {、、、try {//同步调用【执行器函数】executor(resolve, reject)} catch (e) {//修改状态为【失败】reject(e)}}

3. 状态只能修改一次

	function Promise(executor) {、、、//resolve函数function resolve(data) {//判断状态if (self.PromiseState !== 'pending') return;self.PromiseState = 'fulfilled'self.PromiseResult = data}//reject函数function reject(data) {//判断状态if (self.PromiseState !== 'pending') return;self.PromiseState = 'rejected'self.PromiseResult = data}、、、}

4. then方法实现

//添加then方法
Promise.prototype.then = function (onResolved, onRejected) {//调用回调函数if (this.PromiseState === 'fulfilled') {onRejected(this.PromiseResult)}if (this.PromiseState === 'rejected') {onRejected(this.PromiseResult)}}

5. 异步任务 then 方法的实现(保存回调函数)

function Promise(executor) {、、、//声明保存回调函数的属性this.callback = {}//resolve函数function resolve(data) {、、、//执行回调函数if(self.callback.onResolved){self.callback.onResolved(data)}}//reject函数function reject(data) {、、、//执行回调函数if(self.callback.onRejected){self.callback.onRejected(data)}}、、、}//添加then方法
Promise.prototype.then = function (onResolved, onRejected) {、、、//执行异步任务时候,保存回调函数if(this.PromiseState==='pending'){this.callback = {onResolved: onResolved,onRejected: onRejected}}}

6.指定多个回调(callback为数组)

function Promise(executor) {、、、//声明保存回调函数的属性this.callback = []//保留实例对象的this的值const self = this//resolve函数function resolve(data) {、、、//执行回调函数// if (self.callback.onResolved) {//     self.callback.onResolved(data)// }self.callback.forEach(element => {element.onResolved(data)});}//reject函数function reject(data) {、、、//执行回调函数// if (self.callback.onRejected) {//     self.callback.onRejected(data)// }self.callback.forEach(element => {element.onRejected(data)})}、、、}//添加then方法
Promise.prototype.then = function (onResolved, onRejected) {、、、//执行异步任务时候,保存回调函数到callback数组中if(this.PromiseState==='pending'){this.callback.push({onResolved: onResolved,onRejected: onRejected})}}

7.改写同步任务then返回结果为promise对象

//添加then方法
Promise.prototype.then = function (onResolved, onRejected) {//返回一个promise对象return new Promise((resolve, reject) => {//调用回调函数if (this.PromiseState === 'fulfilled') {try {//获取回调函数的结果let result = onResolved(this.PromiseResult)if (result instanceof Promise) {//是Promise对象,通过then方法改变状态和值result.then(v => {resolve(v)}, r => {reject(r)})} else {//不是Promise对象resolve(result)}} catch (e) {reject(e)}}if (this.PromiseState === 'rejected') {try {//获取回调函数的结果let result = onRejected(this.PromiseResult)if (result instanceof Promise) {//是Promise对象,通过then方法改变状态和值result.then(v => {resolve(v)}, r => {reject(r)})} else {//不是Promise对象resolve(result)}} catch (e) {reject(e)}}//执行异步任务时候,保存回调函数、、、}

8.异步任务,改写then返回结果为promise

        if(this.PromiseState==='pending'){//执行异步任务时候,保存回调函数this.callback.push({onResolved: function () {try {let result = onResolved()if (result instanceof Promise) {//是promise对象result.then(v => resolve(v), r => reject(r))} else {//不是promise对象resolve(result)}} catch (e) {reject(e)}},onRejected: function () {try {let result = onRejected()if (result instanceof Promise) {//是promise对象result.then(v => resolve(v), r => reject(r))} else {//不是promise对象resolve(result)}} catch (e) {reject(e)}},})}

9. 优化代码

Promise.prototype.then = function (onResolved, onRejected) {const self = thisreturn new Promise((resolve, reject) => {//封装回调函数代码function callback(type) {try {//获取回调函数的结果let result = type(self.PromiseResult)if (result instanceof Promise) {//是Promise对象,通过then方法改变状态和值result.then(v => {resolve(v)}, r => {reject(r)})} else {//不是Promise对象resolve(result)}} catch (e) {reject(e)}}//调用回调函数if (this.PromiseState === 'fulfilled') {callback(onResolved)}if (this.PromiseState === 'rejected') {callback(onRejected)}if (this.PromiseState === 'pending') {//执行异步任务时候,保存回调函数this.callback.push({onResolved: function () {callback(onResolved)},onRejected: function () {callback(onRejected)},})}})}

10. catch方法与异常穿透

实现以下功能

let p = new Promise((resolve, reject) => {setTimeout(() => {reject('reject')}, 1000)})let res = p.then().then((value) => {console.log(222);}).then(value => {console.log(333);}).catch(reason => {console.warn(reason)})
//输出
//222
//333       

设置默认回调函数

Promise.prototype.then = function (onResolved, onRejected) {const self = this//判断参数,如果不存在回调函数,则设置默认回调函数if (typeof onRejected !== 'function') {onRejected = reason => { throw reason }}if(typeof onResolved !=='function'){onResolved = value =>value}return new Promise((resolve, reject) => {、、、})}//添加catch方法
Promise.prototype.catch = function (onRejected) {return this.then(undefined, onRejected)
}

11. 实现Promise.resolve()

//添加resolve方法
Promise.resolve = function (value) {return new Promise((resolve, reject) => {if (value instanceof Promise) {value.then(v => resolve(v), r => reject(r))} else {resolve(value)}})}

12. 实现Promise.all()

 //添加all方法Promise.all = function (promises) {return new Promise((resolve, reject) => {//声明变量let count = 0let arr = []for (i = 0; i < promises.length; i++) {promises[i].then((value) => {count++;arr[i] = value;if (count === promises.length) {resolve(arr)}}, (reason) => {reject(reason)})}})}

13. 实现Promise.race()方法

 //添加race方法:谁先改变状态,返回哪个promise对象Promise.race = function (promises) {return new Promise((resolve, reject) => {for (i = 0; i < promises.length; i++) {promises[i].then((value) => {resolve(value)}, (reason) => {reject(reason)})}})}

14. then()是异步执行的

         let p1 = new Promise((resolve, reject) => {// setTimeout(() => { r('ok') }, 1000)resolve('ok')console.log(111);})p1.then(value => {console.log(222);})console.log(333);

###
​ 改进方法:让回调函数在定时器内部执行

 Promise.prototype.then = function (onResolved, onRejected) {、、、return new Promise((resolve, reject) => {、、、//调用回调函数if (this.PromiseState === 'fulfilled') {setTimeout(() => { callback(onResolved) })}if (this.PromiseState === 'rejected') {setTimeout(() => { callback(onRejected) })}、、、})}
    function Promise(executor) {、、、//resolve函数function resolve(data) {、、、setTimeout(() => {self.callback.forEach(element => {element.onResolved(data)});})}//reject函数function reject(data) {、、、setTimeout(() => {self.callback.forEach(element => {element.onRejected(data)})})}}

15. 完整代码

 function Promise(executor) {//定义Promise对象的属性this.PromiseState = 'pending'this.PromiseResult = null//声明保存回调函数的属性this.callback = []//保留实例对象的this的值const self = this//resolve函数function resolve(data) {//判断状态if (self.PromiseState !== 'pending') return;self.PromiseState = 'fulfilled'self.PromiseResult = data//执行回调函数// if (self.callback.onResolved) {//     self.callback.onResolved(data)// }setTimeout(() => {self.callback.forEach(element => {element.onResolved(data)});})}//reject函数function reject(data) {//判断状态if (self.PromiseState !== 'pending') return;self.PromiseState = 'rejected'self.PromiseResult = data//执行回调函数// if (self.callback.onRejected) {//     self.callback.onRejected(data)// }setTimeout(() => {self.callback.forEach(element => {element.onRejected(data)})})}try {//同步调用【执行器函数】executor(resolve, reject)} catch (e) {//修改状态为【失败】reject(e)}}//添加then方法Promise.prototype.then = function (onResolved, onRejected) {const self = this//判断参数if (typeof onRejected !== 'function') {onRejected = reason => { throw reason }}if (typeof onResolved !== 'function') {onResolved = value => value}return new Promise((resolve, reject) => {//封装回调函数代码function callback(type) {try {//获取回调函数的结果let result = type(self.PromiseResult)if (result instanceof Promise) {//是Promise对象,通过then方法改变状态和值result.then(v => {resolve(v)}, r => {reject(r)})} else {//不是Promise对象resolve(result)}} catch (e) {reject(e)}}//调用回调函数if (this.PromiseState === 'fulfilled') {setTimeout(() => { callback(onResolved) })}if (this.PromiseState === 'rejected') {setTimeout(() => { callback(onRejected) })}if (this.PromiseState === 'pending') {//执行异步任务时候,保存回调函数this.callback.push({onResolved: function () {callback(onResolved)},onRejected: function () {callback(onRejected)},})}})}//添加catch方法Promise.prototype.catch = function (onRejected) {return this.then(undefined, onRejected)}//添加resolve方法Promise.resolve = function (value) {return new Promise((resolve, reject) => {if (value instanceof Promise) {value.then(v => resolve(v), r => reject(r))} else {resolve(value)}})}//添加reject方法Promise.reject = function (reason) {return new Promise((resolve, reject) => {reject(reason)})}//添加all方法Promise.all = function (promises) {return new Promise((resolve, reject) => {//声明变量let count = 0let arr = []for (i = 0; i < promises.length; i++) {promises[i].then((value) => {count++;arr[i] = value;if (count === promises.length) {resolve(arr)}}, (reason) => {reject(reason)})}})}//添加race方法:谁先改变状态,返回哪个promise对象Promise.race = function (promises) {return new Promise((resolve, reject) => {for (i = 0; i < promises.length; i++) {promises[i].then((value) => {resolve(value)}, (reason) => {reject(reason)})}})}

16. class版本

 class Promise {constructor(executor) {//定义Promise对象的属性this.PromiseState = 'pending'this.PromiseResult = null//声明保存回调函数的属性this.callback = []//保留实例对象的this的值const self = this//resolve函数function resolve(data) {//判断状态if (self.PromiseState !== 'pending') return;self.PromiseState = 'fulfilled'self.PromiseResult = data//执行回调函数// if (self.callback.onResolved) {//     self.callback.onResolved(data)// }setTimeout(() => {self.callback.forEach(element => {element.onResolved(data)});})}//reject函数function reject(data) {//判断状态if (self.PromiseState !== 'pending') return;self.PromiseState = 'rejected'self.PromiseResult = data//执行回调函数// if (self.callback.onRejected) {//     self.callback.onRejected(data)// }setTimeout(() => {self.callback.forEach(element => {element.onRejected(data)})})}try {//同步调用【执行器函数】executor(resolve, reject)} catch (e) {//修改状态为【失败】reject(e)}}then(onResolved, onRejected) {const self = this//判断参数if (typeof onRejected !== 'function') {onRejected = reason => { throw reason }}if (typeof onResolved !== 'function') {onResolved = value => value}return new Promise((resolve, reject) => {//封装回调函数代码function callback(type) {try {//获取回调函数的结果let result = type(self.PromiseResult)if (result instanceof Promise) {//是Promise对象,通过then方法改变状态和值result.then(v => {resolve(v)}, r => {reject(r)})} else {//不是Promise对象resolve(result)}} catch (e) {reject(e)}}//调用回调函数if (this.PromiseState === 'fulfilled') {setTimeout(() => { callback(onResolved) })}if (this.PromiseState === 'rejected') {setTimeout(() => { callback(onRejected) })}if (this.PromiseState === 'pending') {//执行异步任务时候,保存回调函数this.callback.push({onResolved: function () {callback(onResolved)},onRejected: function () {callback(onRejected)},})}})}catch(onRejected) {return this.then(undefined, onRejected)}static resolve(value) {return new Promise((resolve, reject) => {if (value instanceof Promise) {value.then(v => resolve(v), r => reject(r))} else {resolve(value)}})}static reject(reason) {return new Promise((resolve, reject) => {reject(reason)})}static all(promises) {return new Promise((resolve, reject) => {//声明变量let count = 0let arr = []for (i = 0; i < promises.length; i++) {promises[i].then((value) => {count++;arr[i] = value;if (count === promises.length) {resolve(arr)}}, (reason) => {reject(reason)})}})}static race(promises) {return new Promise((resolve, reject) => {for (i = 0; i < promises.length; i++) {promises[i].then((value) => {resolve(value)}, (reason) => {reject(reason)})}})}}

三、async和await

1. async 函数

  • 返回值为promise对象

  • 内部函数返回值决定Promise对象

            async function main() {}console.log(main())
    

    输出:在这里插入图片描述

2. await表达式

  • await右侧一般是promise对象,但是也可以是其他值

  • 如果是promise对象,则await返回的是promise成功时的promise.PromiseResult

  • 如果是其他值,则直接把此值作为await的返回值

  • await必须写在async函数里面

  • 如果await的promise失败了,就会抛出异常,需要通过try…catch捕获处理

            async function main() {let p = new Promise((resolve, reject) => {resolve('ok')})//1.右侧是promise的情况let res1 = await p;//2.右侧是其他类型的情况let res2 = await 20console.log(res1)console.log(res2)//3.右侧是promise失败的情况try {let res3 = await Promise.reject('err')} catch (e) {console.log(e);}}main()
    

    输出:在这里插入图片描述

3. async和await结合的实例一:文件读取

拼接文件1、文件2、文件3

//普通写法
const fs = require('fs')fs.readFile('./resource/1.txt', (err, data1) => {if (err) throw errfs.readFile('./resource/2.txt', (err, data2) => {if (err) throw errfs.readFile('./resource/3.txt', (err, data3) => {if (err) throw errconsole.log(data1 + data2 + data3);})})
})
//async和await结合写法
const fs = require('fs')
const util = require('util')
//将fs.readFile方法的返回值转换为一个promise对象
const mineRead = util.promisify(fs.readFile)async function main() {try {const data1 = await mineRead('./resource/11.txt')const data2 = await mineRead('./resource/2.txt')const data3 = await mineRead('./resource/3.txt')console.log(data1 + data2 + data3);} catch (e) {console.log(e);}}main()

4. async和await结合实例二:AJAX

        function sendAJAX(url) {return new Promise((resolve, reject) => {const xhr = new XMLHttpRequest();xhr.open('GET', url);xhr.send();xhr.onreadystatechange() = function () {if (xhr.readyState === 4) {if (xhr.status >= 200 && xhr.status < 300) {resolve(xhr.response)} else {reject(xhr.status)}}}})}async function duanzi() {const res =   await sendAJAX('https://api.apiopen.top/getJoke')console.log(res);}

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

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

相关文章

怎么修复松下相机死机视频只有0字节(0KB)的MDT文件【实测可修复】

死机后视频文件大小仅为0字节 松下S5相机录像死机&#xff0c;关机重新开机后有一个视频文件变成MDT&#xff0c;大小为0KB&#xff0c;录了30多分钟&#xff0c;本应为MOV格式的视频。0字节文件可以修复吗&#xff1f;怎么修复0字节的MDT文件为视频&#xff1f; 数据提取与视…

四款免费视频剪辑工具使用感受与优劣势总结

在如今这个视频内容如火如荼的时代&#xff0c;如何快速高效地完成视频剪辑成为许多人关心的问题&#xff1b;今天&#xff0c;我们就来轻松愉快地聊一聊本人常用的四款免费的视频剪辑工具&#xff1b;这四款工具各有千秋&#xff0c;让我们一起来看看它们的使用感受和优劣势吧…

数据结构(并查集) How did you do it? 怎么做到的!!!

一、前言 并查集的历史 1964年&#xff0c; Bernard A. Galler 和 Michael J. Fischer 首次描述了不相交的并查集&#xff0c;1975 年&#xff0c;Robert Tarjan 是第一个证明O(ma(n))&#xff08;逆阿克曼函数 (opens new window)&#xff09;算法时间复杂度的上限&#xff…

C语言深入了解指针一(14)

文章目录 前言一、内存和地址内存究竟该如何理解编址 二、指针变量和地址取地址操作符&解引用操作符*指针变量的大小 总结 前言 终于来到指针啦&#xff01;如前篇末尾总结所说&#xff0c;这是你们马上要下大功夫的地方   但是&#xff0c;就像我们上初中的时候&#xf…

【开发工具】IntelliJ IDEA插件推荐:Json Helper——让JSON处理更高效

导语&#xff1a;在Java开发过程中&#xff0c;JSON作为一种轻量级的数据交换格式&#xff0c;被广泛应用于前后端数据交互。今天&#xff0c;我要为大家介绍一款IntelliJ IDEA插件——Json Helper&#xff0c;帮助开发者更高效地处理JSON数据。 一、什么是Json Helper&#x…

智能优化算法-樽海鞘优化算法(SSA)(附源码)

目录 1.内容介绍 2.部分代码 3.实验结果 4.内容获取 1.内容介绍 樽海鞘优化算法 (Salp Swarm Algorithm, SSA) 虽然名称中提到的是“樽海鞘”&#xff0c;但实际上这个算法是基于群体智能的一种元启发式优化算法&#xff0c;它模拟了樽海鞘&#xff08;Salps&#xff09;在海…

C语言:刷题日志(3)

一.猴子选大王 一群猴子要选新猴王。新猴王的选择方法是&#xff1a;让N只候选猴子围成一圈&#xff0c;从某位置起顺序编号为1~N号。从第1号开始报数&#xff0c;每轮从1报到3&#xff0c;凡报到3的猴子即退出圈子&#xff0c;接着又从紧邻的下一只猴子开始同样的报数。如此不…

阿里云镜像报错 [Errno 14] HTTP Error 302 - Found 问题解决记录

1、问题背景和解决思路 在本地安装 CentOS7 后&#xff0c;网络已调通可正常上网&#xff0c;但切换阿里云镜像后&#xff0c;使用 yum 安装软件时出现 “[Errno 14] HTTPS Error 302 - Found Trying other mirror.” 报错&#xff0c;原因是 yum 源配置问题。给出了详细的解决…

苹果首款AI手机发布!iPhone 16全新AI功能体验感拉满

苹果于2024年秋季盛大发布iPhone 16系列&#xff0c;带来前所未有的AI智能体验。iPhone 16系列不仅硬件全面升级&#xff0c;更融入了尖端的AI技术&#xff0c;为用户带来更加智能化的生活体验。 在科技春晚的舞台上&#xff0c;苹果不负众望地揭开了iPhone 16系列的神秘面纱。…

ubuntu20.04 Qt6引用dcmtk库实现dicom文件读取和字符集转换

1 环境问题 安装完Qt6&#xff0c;新建Qt/QtQuick CMake工程编译出现如下错误: Found package configuration file: Qt6Config.cmake but it set Qt6 FOUND to FALSE so package "Qt6" is considered to be NOT FOUND. 原因&#xff1a; 这是因为系统中缺少OpenG…

缓存穿透、缓存雪崩、缓存击穿

图片没了&#xff0c;真的难受啊。。 缓存穿透 缓存穿透 &#xff1a;缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在&#xff0c;这样缓存永远不会生效&#xff0c;这些请求都会打到数据库。 常见的解决方案有两种&#xff1a; 缓存空对象 优点&#xff1a;实现简单…

Java 入门指南:Java 并发编程 —— 同步工具类 CountDownLatch(倒计时门闩)

文章目录 同步工具类CountDownLatch常用方法使用步骤适用场景使用示例 同步工具类 JUC&#xff08;Java.util.concurrent&#xff09;是 Java 提供的用于并发编程的工具类库&#xff0c;其中包含了一些通信工具类&#xff0c;用于在多个线程之间进行协调和通信&#xff0c;特别…

uniapp媒体

uni.previewImage实现图片放大预览 // 图片预览函数function onPreview(index) {// 收集所有图片的urlvar urls pets.value.data.map(item > item.url)// 预览图片uni.previewImage({current: index, // 当前预览的图片索引urls: urls // 所有图片的url数组})}

大模型api谁家更便宜

1 openai 可点此链接查询价格&#xff1a;https://openai.com/api/pricing/ 2 百度 可点此链接查询价格&#xff1a;https://console.bce.baidu.com/qianfan/chargemanage/list 需要注意&#xff0c;百度千帆平台上还提供其他家的模型调用服务&#xff0c; 如llama, yi-34b等…

秋招突击——算法练习——9/4——73-矩阵置零、54-螺旋矩阵、48-旋转图像、240-搜索二维矩阵II

文章目录 引言复习新作73-矩阵置零个人实现 54-螺旋矩阵个人实现参考实现 48-旋转图像个人实现参考实现 240-搜索二维矩阵II个人实现参考实现 总结 引言 秋招开展的不是很顺利&#xff0c;还是要继续准备&#xff0c;继续刷算法&#xff01;不断完善自己&#xff0c;希望能够找…

yolov5 +gui界面+单目测距 实现对图片视频摄像头的测距

可实现对图片&#xff0c;视频&#xff0c;摄像头的检测 项目概述 本项目旨在实现一个集成了YOLOv5目标检测算法、图形用户界面&#xff08;GUI&#xff09;以及单目测距功能的系统。该系统能够对图片、视频或实时摄像头输入进行目标检测&#xff0c;并估算目标的距离。通过…

揭开Facebook AI的神秘面纱:如何利用人工智能提升社交体验

人工智能&#xff08;AI&#xff09;正迅速成为推动技术进步的核心力量&#xff0c;而Facebook作为全球领先的社交媒体平台&#xff0c;正通过AI技术不断提升用户体验和平台功能。本文将深入探讨Facebook如何利用AI技术&#xff0c;优化社交互动、内容推荐和用户管理&#xff0…

Sentinel 使用案例详细教程

文章目录 一、Sentinel 使用1.1 Sentinel 客户端1.2 Sentinel 控制台1.3 客户端和控制台的通信所需依赖 二、测试 Sentinel 限流规则2.1 启动配置2.2 定义限流资源2.3 配置流量控制规则2.4 运行项目 三、 测试 Sentinel 熔断降级规则3.1 定义资源3.2 配置熔断降级规则3.3 运行项…

info_scan!自动化漏洞扫描系统,附下载链接

在我们团队的日常工作中&#xff0c;定期进行安全演练和漏洞扫描几乎是必不可少的。每次安全互动我们都需要对关键资产进行全面的安全评估&#xff0c;及时发现可能存在的安全隐患。 就在上周&#xff0c;我们针对几个主要服务进行了例行的漏洞扫描。在这个过程中&#xff0c;…

DevOps平台搭建过程详解--Gitlab+Jenkins+Docker+Harbor+K8s集群搭建CICD平台

一、环境说明 1.1CI/CD CI即为持续集成(Continue Integration,简称CI)&#xff0c;用通俗的话讲&#xff0c;就是持续的整合版本库代码编译后制作应用镜像。建立有效的持续集成环境可以减少开发过程中一些不必要的问题、提高代码质量、快速迭代等;(Jenkins) CD即持续交付Con…