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

沈阳网站设计制作/seo博客模板

沈阳网站设计制作,seo博客模板,基于h5的个人网站建设,做中英文网站 java主要由基础实现和静态类的实现两部分组成。 1 基础实现(不含静态类) 1.1 使用类实现完成构造函数 实现代码如下,构造函数传入一个回调函数,定义resolve和reject函数,将两个函数作为参数执行回调函数。 // 1. 使用类实…

主要由基础实现和静态类的实现两部分组成。

1 基础实现(不含静态类)

 1.1 使用类实现完成构造函数

        实现代码如下,构造函数传入一个回调函数,定义resolve和reject函数,将两个函数作为参数执行回调函数。

// 1. 使用类实现,完成构造函数
class MyGoPromise{constructor(callback){const resolve = (result) => {console.log(result)}const reject = (result) => {console.log(result)}callback(resolve, reject)}
}

        测试代码如下:

const p = new MyGoPromise((resolve, reject) => {resolve("success")// reject("fail")
})

 1.2 实现状态(pending fulfilled rejected)及结果

        首先状态在类内直接声明默认值,状态固定为三个,声明为类外的字符串常量使用。实现在reject和resolve调用时候的状态变化(pending -> fulfilled, pending --> rejected)以及结果保存。代码实现如下所示:

// 2. 状态及原因 state(pending fulfilled rejected) result
// 常量最好单独定义,方便维护
const PENDING = "pending"
const FULFILLED = "fulfilled"
const REJECTED = "rejected"
class MyGoPromise{state = PENDINGresult = undefinedconstructor(callback){const resolve = (result) => {// 状态只能从pending变为fulfilled或者rejectedif(this.state === PENDING){this.state = FULFILLEDthis.result = result}}const reject = (result) => {if(this.state === PENDING){this.state = REJECTEDthis.result = result}}callback(resolve, reject)}
}

        测试代码如下:

const p = new MyGoPromise((resolve, reject) => {resolve("success")// reject("fail")
})
console.log(p)

 1.3 then的基础实现

  1.3.1 then的成功以及失败回调实现(同步)

        then接收两个回调函数,成功回调以及失败的回调,通过查阅文档得知传入非函数时,成功返回为x => x,失败返回为 x => throw x。然后根据状态执行相应的回调函数。then实现的代码如下:

then(onFulFilled, onRejected){onFulFilled = typeof onFulFilled === "function" ? onFulFilled : x => xonRejected = typeof onRejected === "function" ? onRejected : e => {throw e}if(this.state === FULFILLED){onFulFilled(this.result)}else if(this.state === REJECTED){onRejected(this.result)}}

        测试代码如下所示:

const p = new MyGoPromise((resolve, reject) => {// resolve("success")reject("fail")
})p.then(res => {console.log(res)}, err => {console.log(err)})
console.log(p)

  1.3.2 then的异步支持以及多次调用

        之前的then执行的都是同步任务,需要加入对如setTimeout等异步执行的支持,修改then函数,增加判断条件pending,成立将回调暂存到隐私函数handlers中,等到rejecet或resolve时再执行,修改的代码如下(包含then和reject和resolve的调用逻辑的修改):

constructor(callback){const resolve = (result) => {// 状态只能从pending变为fulfilled或者rejectedif(this.state === PENDING){this.state = FULFILLEDthis.result = resultthis.#handlers.forEach(({onFulFilled}) => {onFulFilled(this.result)})}}const reject = (result) => {if(this.state === PENDING){this.state = REJECTEDthis.result = resultthis.#handlers.forEach(({onRejected}) => {onRejected(this.result)})}}callback(resolve, reject)}then(onFulFilled, onRejected){// 当传入的值不是函数时,需要按照以下两种形式返回onFulFilled = typeof onFulFilled === "function" ? onFulFilled : x => xonRejected = typeof onRejected === "function" ? onRejected : e => {throw e}if(this.state === FULFILLED){onFulFilled(this.result)}else if(this.state === REJECTED){onRejected(this.result)}else{this.#handlers.push({onFulFilled,onRejected})}}
}

 1.4 异步任务

        当我们使用下述代码测试我们已经实现的内容时会发现输出的顺序错误,代码如下所示:

// !!! 输出顺序有误 原生Promise输出为 start end success
// !!! 自定义Promise输出为 start success end
// 所以需要引入异步任务 选用核心API queueMicrotask MutationObserver setTimeout
console.log("start")
const p = new MyGoPromise((resolve, reject) => {resolve("success")
})
p.then(res => console.log(res))
console.log("end")

  1.4.1 异步主要API

        1. queueMicrotask函数直接传入回调函数即可执行

console.log("start")
queueMicrotask(()=>{console.log("queueMicrotask")
})
console.log("end")

        2.  MutationObserver notice:only works in browser 子节点改变就会执行

console.log("start")
const obs = new MutationObserver(()=>{console.log("MutationObserver")
})const divNode = document.createElement("div")
obs.observe(divNode, {childList: true})
divNode.innerHTML = "MyGo!!!!!"
console.log("end")

        3. setTimeout(callback, 0) 

  1.4.2  异步任务实现

        将异步任务执行封装成全局函数调用,用于判断以上三种异步实现浏览器是否支持,实现的runAsyncTask函数如下所示:

function runAsyncTask(callback){if(typeof queueMicrotask === "function"){queueMicrotask(callback)}else if(typeof MutationObserver === "function"){const obs = new MutationObserver(callback)const divNode = document.createElement("div")obs.observe(divNode, {childList: true})divNode.innerHTML = "MyGo!!!!!"}else{setTimeout(callback, 0)}
}

        修改then函数逻辑,将回调函数封装成异步任务执行,代码如下:

then(onFulFilled, onRejected){// 当传入的值不是函数时,需要按照以下两种形式返回onFulFilled = typeof onFulFilled === "function" ? onFulFilled : x => xonRejected = typeof onRejected === "function" ? onRejected : e => {throw e}if(this.state === FULFILLED){// 异步任务runAsyncTask(()=>{onFulFilled(this.result)})    }else if(this.state === REJECTED){// 异步任务runAsyncTask(()=>{onRejected(this.result)})}else{this.#handlers.push({onFulFilled:() => {// 异步任务runAsyncTask(()=>{onFulFilled(this.result)})},onRejected: () =>{// 异步任务runAsyncTask(() => {onRejected(this.result)})}})}}

 1.5 链式编程

        链式编程实现then的链式调用,错误处理,返回值处理(通常分为返回Promise 正常值 多重引用)。

  1.5.1 处理异常和普通返回值(fulfilled state)

        首先实现链式调用,使用new再then函数中创建一个全新的Promise对象,将对象返回,将之前then函数的执行逻辑放入新的Promise的回调函数当中(因为会立即执行),单独处理fulfilled分支使用try...catch...捕获错误,使用reject返回错误,获取回调函数返回值,然后resolve,代码如下:

    then(onFulFilled, onRejected){// 当传入的值不是函数时,需要按照以下两种形式返回onFulFilled = typeof onFulFilled === "function" ? onFulFilled : x => xonRejected = typeof onRejected === "function" ? onRejected : e => {throw e}// 在newPromise时传入的回调函数会立即执行const newPromise = new MyGoPromise((resolve, reject) => {if(this.state === FULFILLED){// 异步任务runAsyncTask(()=>{try {const x = onFulFilled(this.result)resolve(x)} catch (error) {reject(error) }}) }else if(this.state === REJECTED){// 异步任务runAsyncTask(()=>{onRejected(this.result)})}else{this.#handlers.push({onFulFilled:() => {// 异步任务runAsyncTask(()=>{onFulFilled(this.result)})},onRejected: () =>{// 异步任务runAsyncTask(() => {onRejected(this.result)})}})}})return newPromise}

        测试代码如下:

const p = new MyGoPromise((resolve, reject) => {resolve(1)
})p.then(res =>{console.log(res)// throw "error layer1"return 100
}).then(res =>{console.log(res + " sub")
}, err =>{console.log(err + "sub")
})

  1.5.2 处理返回Promise对象 (fulfilled state)

        使用instance of判断,promise对象调用then方法处理,代码如下所示:

    then(onFulFilled, onRejected){// 当传入的值不是函数时,需要按照以下两种形式返回onFulFilled = typeof onFulFilled === "function" ? onFulFilled : x => xonRejected = typeof onRejected === "function" ? onRejected : e => {throw e}// 在newPromise时传入的回调函数会立即执行const newPromise = new MyGoPromise((resolve, reject) => {if(this.state === FULFILLED){// 异步任务runAsyncTask(()=>{try {const x = onFulFilled(this.result)// 在这里处理Promise对象根据结果提交if(x instanceof MyGoPromise){x.then(res =>{resolve(res)}, err =>{reject(err)})}else{resolve(x)}} catch (error) {reject(error) }}) }else if(this.state === REJECTED){// 异步任务runAsyncTask(()=>{onRejected(this.result)})}else{this.#handlers.push({onFulFilled:() => {// 异步任务runAsyncTask(()=>{onFulFilled(this.result)})},onRejected: () =>{// 异步任务runAsyncTask(() => {onRejected(this.result)})}})}})return newPromise}
}

        测试代码如下:

// 测试代码 -- 返回Promise对象
const p = new MyGoPromise((resolve, reject) => {resolve(1)
})p.then(res =>{return new MyGoPromise((resolve, reject) => {// resolve(2)reject("error layer2")})
}).then(res =>{// 要拿到上一个Promise resolve的结果console.log(res + " sub")
}, err =>{console.log(err + "sub")
})

  1.5.3 处理重复引用 (fulfilled state)

        只需要判断我们取到的回调函数的返回值和创建的新的promise对象是否一致即可,代码(包含测试代码)如下所示:

if(x === newPromise)
{throw new TypeError("Chaining cycle detected for promise")
}// test code
const p = new MyGoPromise((resolve, reject) => {resolve(1)
})const p2 = p.then((res)=>{return p2
})

  1.5.4 处理rejected state 封装函数

        遵循同一套逻辑,首先进行错误处理,然后判断重复引用和回调结果是否是Promise对象,所以封装函数如下:

function resolvePromise(newPromise, x, resolve, reject){if(x === newPromise){throw new TypeError("Chaining cycle detected for promise")}if(x instanceof MyGoPromise){x.then(res =>{resolve(res)}, err =>{reject(err)})}else{resolve(x)}
}

         使用封装函数,代码如下:

    then(onFulFilled, onRejected){// 当传入的值不是函数时,需要按照以下两种形式返回onFulFilled = typeof onFulFilled === "function" ? onFulFilled : x => xonRejected = typeof onRejected === "function" ? onRejected : e => {throw e}// 在newPromise时传入的回调函数会立即执行const newPromise = new MyGoPromise((resolve, reject) => {if(this.state === FULFILLED){// 异步任务runAsyncTask(()=>{try {const x = onFulFilled(this.result)resolvePromise(newPromise, x, resolve, reject)} catch (error) {reject(error) }}) }else if(this.state === REJECTED){// 异步任务runAsyncTask(()=>{try {const x = onRejected(this.result)resolvePromise(newPromise, x, resolve, reject)} catch (error) {reject(error)}})}else{this.#handlers.push({onFulFilled:() => {// 异步任务runAsyncTask(()=>{onFulFilled(this.result)})},onRejected: () =>{// 异步任务runAsyncTask(() => {onRejected(this.result)})}})}})return newPromise}

        测试代码如下:

// 测试代码
const p = new MyGoPromise((resolve, reject) => {reject(1)
})const p2 = p.then(undefined, res =>{// return 2// return p2throw "error"// return new MyGoPromise((resolve, reject) => {//     resolve(3)// })
})p2.then((res)=>{console.log("p2-res: ", res)
}, err =>(console.log("p2-err: ", err)
))

  1.5.5 处理pending state 调用函数

        和处理fulfilled和rejected状态一样,代码如下所示:

    then(onFulFilled, onRejected){// 当传入的值不是函数时,需要按照以下两种形式返回onFulFilled = typeof onFulFilled === "function" ? onFulFilled : x => xonRejected = typeof onRejected === "function" ? onRejected : e => {throw e}// 在newPromise时传入的回调函数会立即执行const newPromise = new MyGoPromise((resolve, reject) => {if(this.state === FULFILLED){// 异步任务runAsyncTask(()=>{try {const x = onFulFilled(this.result)resolvePromise(newPromise, x, resolve, reject)} catch (error) {reject(error) }}) }else if(this.state === REJECTED){// 异步任务runAsyncTask(()=>{try {const x = onRejected(this.result)resolvePromise(newPromise, x, resolve, reject)} catch (error) {reject(error)}})}else{this.#handlers.push({onFulFilled:() => {// 异步任务runAsyncTask(()=>{try {const x = onFulFilled(this.result)resolvePromise(newPromise, x, resolve, reject)} catch (error) {reject(error)}})},onRejected: () =>{// 异步任务runAsyncTask(() => {try {const x = onRejected(this.result)resolvePromise(newPromise, x, resolve, reject)} catch (error) {reject(error)}})}})}})return newPromise}

        测试代码如下:

// 测试代码
const p = new MyGoPromise((resolve, reject) => {setTimeout(()=>{resolve("success")}, 2000)
})const p2 = p.then(res =>{// return 2// return p2throw "error"// return new MyGoPromise((resolve, reject) => {//     resolve(3)// })
})p2.then((res)=>{console.log("p2-res: ", res)
}, err =>(console.log("p2-err: ", err)
))

1.6 实现catch方法

        处理错误,相当于调用then方法,但是还要处理new Promise回调里面的函数错误,修改部分代码如下:

    
//新增catch函数
catch(onRejected){// 相当于变相调用then方法return this.then(undefined, onRejected)
}// 处理实例化时的异常try {callback(resolve, reject)} catch (error) {// 处理实例化时的异常reject(error)}

        测试的代码如下所示:

// 测试代码
const p = new MyGoPromise((resolve, reject) => {throw "error"// reject("reject-error")
})p.then((res)=>{console.log("p-res: ", res)
}).catch(err =>(console.log("p-catch-err: ", err)
))

 1.7 finally实现

        不管是什么状态,最终都要执行的回调函数,也是调用then方法,只是不管是成功回调还是失败回调都是同一个回调函数,实现代码如下:

finally(onFinally){return this.then(onFinally, onFinally)
}

        测试代码如下:

const p = new MyGoPromise((resolve, reject) => {throw "error"// reject("reject-error")
})p.then((res)=>{console.log("p-res: ", res)
}).catch(err =>(console.log("p-catch-err: ", err)
)).finally(()=>{console.log("finally")
})

2 静态类方法实现

 2.1 resolve方法实现

        调用该方法将传入的值(非Promise)转换为fulfilled状态的Promise返回,如果传入Promise直接返回。

static resolve(value){if(value instanceof MyGoPromise){return value}return new MyGoPromise((resolve) => {resolve(value)})
}

        测试代码如下:

// 测试代码
const p = MyGoPromise.resolve(new MyGoPromise((resolve, reject) => {// resolve("success")reject("reject-error")})
).then(res =>{console.log("res: ", res)
}, err =>{console.log("err: ", err)
})

 2.2 reject方法实现

        不管传入什么值,直接将返回值作为原因返回rejected状态的promise,实现的代码如下:

static reject(value){return new MyGoPromise((resolve, reject) => {reject(value)})
}

        测试代码如下:

// 测试代码
MyGoPromise.reject("reject-error").catch(err =>{console.log("err: ", err)
})

 2.3 race方法实现

        race接收一个数组作为参数,返回最先完成(fulfilled)的promise对象,如果传入不是数组则拨错,实现代码如下:

static race(promises){return new MyGoPromise((resolve, reject) => {if(!Array.isArray(promises)){reject(new TypeError("Argument is not iterable"))}promises.forEach(promise =>{MyGoPromise.resolve(promise).then(res => {resolve(res)}, err =>{reject(err)})})})
}

        测试代码如下:

// 测试代码
const p1 = new MyGoPromise((resolve, reject) => {setTimeout(()=>{resolve("success")}, 2000)
})const p2 = new MyGoPromise((resolve, reject) => {setTimeout(()=>{reject("reject-error")}, 1000)
})MyGoPromise.race([p1, p2]).then(res =>{console.log("res: ", res)
}, err =>{console.log("err: ", err)
})

 2.4 all方法实现

        也是传入一个数组,有一个错误就reject,全部成功返回一个数组(按顺序),如果传入空数组直接返回空数组结果,实现代码如下:

static all(promises){// 1.返回Promise实例// 2.判断是否时数组// 3. 判断是否为空数组,空数组直接兑现// 4. 处理全部兑现 v,k 存储数据, count计数判断是否拒绝// 5. 处理拒绝 直接拒绝即可return new MyGoPromise((resolve, reject) => {if(!Array.isArray(promises)){reject(new TypeError("Argument is not iterable"))}promises.length === 0 && resolve([])let count = 0const result = []promises.forEach((promise, index) => {MyGoPromise.resolve(promise).then(res =>{result[index] = rescount ++count === promises.length && resolve(result)}, err =>{reject(err)})})}) 
}

        测试代码如下所示:

// 测试代码
const p1 = new MyGoPromise((resolve, reject) => {setTimeout(()=>{resolve("success 1")}, 2000)
})const p2 = new MyGoPromise((resolve, reject) => {setTimeout(()=>{resolve("success 2")}, 1000)
})MyGoPromise.all([p1, p2]).then(res =>{console.log("res: ", res)
}, err =>{console.log("err: ", err)
})

 2.5 allsettled方法实现

        无论成功还是失败,都是返回一个对象数组,数组中存储state和value以及reason,基本照搬all方法的实现,代码如下:

static allsettled(promises){return new MyGoPromise((resolve, reject) => {if(!Array.isArray(promises)){reject(new TypeError("Argument is not iterable"))}promises.length === 0 && resolve([])let count = 0const result = []promises.forEach((promise, index) => {MyGoPromise.resolve(promise).then(res =>{result[index] = {value: res,status: "fulfilled",}count ++count === promises.length && resolve(result)}, err =>{result[index] = {reason: err,status: "rejected"}count ++count === promises.length && resolve(result)})})}) 
}

        测试代码如下所示:

// 测试代码
const p1 = new MyGoPromise((resolve, reject) => {setTimeout(()=>{resolve("success 1")}, 2000)
})const p2 = new MyGoPromise((resolve, reject) => {setTimeout(()=>{reject("success 2")}, 1000)
})MyGoPromise.allsettled([1, p1, p2]).then(res =>{// 会打印成功和失败的结果console.log("res: ", res)
}, err =>{console.log("err: ", err)
})

 2.6 any方法实现

        任意一个成功就返回成功,全部失败才返回失败,和all反着来,但是在any方法中,如果传入空数组也会有aggregate的报错,是新代码如下:

static any(promises){return new MyGoPromise((resolve, reject)=>{if(!Array.isArray(promises)){reject(new TypeError("Argument is not iterable"))}promises.length === 0 && reject(new AggregateError([]))let count = 0const errors = []promises.forEach((promise, index)=>{MyGoPromise.resolve(promise).then(res => {resolve(res)}, err => {errors[index] = errcount ++count === promises.length && reject(new AggregateError(errors))})})})
}

        测试代码如下所示:

// 测试代码
const p1 = new MyGoPromise((resolve, reject) => {setTimeout(()=>{resolve("success 1")}, 2000)
})const p2 = new MyGoPromise((resolve, reject) => {setTimeout(()=>{reject("success 2")}, 1000)
})MyGoPromise.any([p1, p2, MyGoPromise.reject(1)]).then(res =>{// 会打印第一个成功的结果 1console.log("res: ", res)
}, err =>{console.log("err: ", err)
})

3 完整代码展示

function runAsyncTask(callback){if(typeof queueMicrotask === "function"){queueMicrotask(callback)}else if(typeof MutationObserver === "function"){const obs = new MutationObserver(callback)const divNode = document.createElement("div")obs.observe(divNode, {childList: true})divNode.innerHTML = "MyGo!!!!!"}else{setTimeout(callback, 0)}
}function resolvePromise(newPromise, x, resolve, reject){if(x === newPromise){throw new TypeError("Chaining cycle detected for promise")}if(x instanceof MyGoPromise){x.then(res =>{resolve(res)}, err =>{reject(err)})}else{resolve(x)}
}const PENDING = "pending"
const FULFILLED = "fulfilled"
const REJECTED = "rejected"
class MyGoPromise{state = PENDINGresult = undefined// 使用对象数组保存pending时候的失败调用和成功调用#handlers = []constructor(callback){const resolve = (result) => {// 状态只能从pending变为fulfilled或者rejectedif(this.state === PENDING){this.state = FULFILLEDthis.result = resultthis.#handlers.forEach(({onFulFilled}) => {onFulFilled(this.result)})}}const reject = (result) => {if(this.state === PENDING){this.state = REJECTEDthis.result = resultthis.#handlers.forEach(({onRejected}) => {onRejected(this.result)})}}try {callback(resolve, reject)} catch (error) {// 处理实例化时的异常reject(error)}}then(onFulFilled, onRejected){// 当传入的值不是函数时,需要按照以下两种形式返回onFulFilled = typeof onFulFilled === "function" ? onFulFilled : x => xonRejected = typeof onRejected === "function" ? onRejected : e => {throw e}// 在newPromise时传入的回调函数会立即执行const newPromise = new MyGoPromise((resolve, reject) => {if(this.state === FULFILLED){// 异步任务runAsyncTask(()=>{try {const x = onFulFilled(this.result)resolvePromise(newPromise, x, resolve, reject)} catch (error) {reject(error) }}) }else if(this.state === REJECTED){// 异步任务runAsyncTask(()=>{try {const x = onRejected(this.result)resolvePromise(newPromise, x, resolve, reject)} catch (error) {reject(error)}})}else{this.#handlers.push({onFulFilled:() => {// 异步任务runAsyncTask(()=>{try {const x = onFulFilled(this.result)resolvePromise(newPromise, x, resolve, reject)} catch (error) {reject(error)}})},onRejected: () =>{// 异步任务runAsyncTask(() => {try {const x = onRejected(this.result)resolvePromise(newPromise, x, resolve, reject)} catch (error) {reject(error)}})}})}})return newPromise}catch(onRejected){// 相当于变相调用then方法return this.then(undefined, onRejected)}finally(onFinally){return this.then(onFinally, onFinally)}static resolve(value){if(value instanceof MyGoPromise){return value}return new MyGoPromise((resolve) => {resolve(value)})}static reject(value){return new MyGoPromise((resolve, reject) => {reject(value)})}static race(promises){return new MyGoPromise((resolve, reject) => {if(!Array.isArray(promises)){reject(new TypeError("Argument is not iterable"))}promises.forEach(promise =>{MyGoPromise.resolve(promise).then(res => {resolve(res)}, err =>{reject(err)})})})}static all(promises){// 1.返回Promise实例// 2.判断是否时数组// 3. 判断是否为空数组,空数组直接兑现// 4. 处理全部兑现 v,k 存储数据, count计数判断是否拒绝// 5. 处理拒绝 直接拒绝即可return new MyGoPromise((resolve, reject) => {if(!Array.isArray(promises)){reject(new TypeError("Argument is not iterable"))}promises.length === 0 && resolve([])let count = 0const result = []promises.forEach((promise, index) => {MyGoPromise.resolve(promise).then(res =>{result[index] = rescount ++count === promises.length && resolve(result)}, err =>{reject(err)})})}) }static allsettled(promises){return new MyGoPromise((resolve, reject) => {if(!Array.isArray(promises)){reject(new TypeError("Argument is not iterable"))}promises.length === 0 && resolve([])let count = 0const result = []promises.forEach((promise, index) => {MyGoPromise.resolve(promise).then(res =>{result[index] = {value: res,status: "fulfilled",}count ++count === promises.length && resolve(result)}, err =>{result[index] = {reason: err,status: "rejected"}count ++count === promises.length && resolve(result)})})}) }static any(promises){return new MyGoPromise((resolve, reject)=>{if(!Array.isArray(promises)){reject(new TypeError("Argument is not iterable"))}promises.length === 0 && reject(new AggregateError([]))let count = 0const errors = []promises.forEach((promise, index)=>{MyGoPromise.resolve(promise).then(res => {resolve(res)}, err => {errors[index] = errcount ++count === promises.length && reject(new AggregateError(errors))})})})}}

相关文章:

从0开始实现es6 promise类

主要由基础实现和静态类的实现两部分组成。 1 基础实现(不含静态类) 1.1 使用类实现完成构造函数 实现代码如下,构造函数传入一个回调函数,定义resolve和reject函数,将两个函数作为参数执行回调函数。 // 1. 使用类实…...

XML 编码

XML 编码 XML(可扩展标记语言)是一种用于存储和传输数据的标记语言。它由万维网联盟(W3C)开发,旨在提供一种标准的方式来结构化、存储和传输数据。XML的设计目标是既易于人类阅读,也易于机器解析。 XML的…...

AI周报(9.22-9.28)

AI应用-Siipet宠物沟通师 Siipet是一款由SiiPet公司推出的创新宠物行为分析相机,旨在通过尖端技术加深宠物与主人之间的情感联系。这款相机利用先进的AI算法,能够自动识别和分析家中宠物的行为,并提供定制化的护理建议。 SiiPet相机的核心功…...

基于RealSense D435相机实现手部姿态重定向

基于Intel RealSense D435相机和MediaPipe的手部姿态检测,进一步简单实现手部姿态与机器人末端的重定向,获取手部的6D坐标(包括位置和姿态)。 假设已经按照【基于 RealSenseD435i相机实现手部姿态检测】配置好所需的库和环境&…...

js中防抖 debounce 节流 throttle 原理 从0手动实现

1 防抖 高频触发事件时,执行损耗高的操作,连续触发过程中,只执行最后一次。 高频事件:input scroll resize等。损耗高:网络请求、dom操作。 实现防抖步骤:1.在回调函数中判断timer是否存在,存在…...

AIGC: 10 AI转文服务器的搭建过程记录

上图是台风席卷城市,现在企业的服务基本都是混合部署,云计算厂商的机房往往可以提供比较好的保护,一般在地下,扛多少级地震,扛多少级台风,而自建机房,往往写字楼经常停电,网络运营上…...

性能测试1初步使用Jmeter

当你看到这边文章的时候,详细你已经知道啥是性能测试,以及也听说过Jmeter了,所以不过多介绍,这里,只是帮助你快速的使用Jmeter来测试接口。 1获取安装包 官网下载地址:https://jmeter.apache.org/downloa…...

OpenGL ES 绘制一个三角形(2)

OpenGL ES 绘制一个三角形(2) 简述 本节我们基于Android系统,使用OpenGL ES来实现绘制一个三角形。在OpenGL ES里,三角形是一个基础图形,其他的图形都可以使用三角形拼接而成,所以我们就的案例就基于这个开始。 在Android系统中…...

QT----Creater14.0,qt5.15无法启动调试,Launching GDB Debugger报红

问题描述 使用QT Creater 14.0 和qt5.15,无法启动调试也没有报错,加载debugger报红 相关文件都有 解决方案 尝试重装QT,更换版本5.15.2,下载到文件夹,shift鼠标右键打开powershell输入 .\qt-online-installer-windows-x64-4.8.0.exe --mirror http://mirrors.ustc.edu.cn…...

初试React前端框架

文章目录 一、React概述二、React核心特性1、组件化设计2、虚拟DOM3、生态系统 三、实例操作1、准备工作2、创建项目结构3、启动项目4、编写React组件5、添加React样式6、运行项目,查看效果 四、实战小结 一、React概述 大家好,今天我们将一起探索React…...

华为OD机试真题---手机App防沉迷系统

题目概述 智能手机在方便我们生活的同时,也侵占了大量时间。手机App防沉迷系统旨在帮助用户合理规划手机App使用时间,确保在正确的时间做正确的事。系统的主要功能包括: 在一天24小时内,可注册每个App的允许使用时段。一个时段只…...

物流货运托运发货单二联三联打印软件定制 佳易王物流单管理系统操作教程

一、前言 物流货运托运发货单二联三联打印软件定制 佳易王物流单管理系统操作教程 1、软件为绿色免安装版,解压即可使用,已经内置数据库,不需再安装。 2、软件下载可以到本文章最后点击官网卡片下。 二、软件程序教程 1、如图,…...

代码随想录算法训练营| 找树左下角的值 、 路径总和 、 从中序与后序遍历序列构造二叉树

找树左下角的值 题目 参考文章 思路:这里寻找最左下角的值,其实用前中后序都是可以的,只要保证第一遍历的是左边开始就可以。设置Deep记录遍历的最大深度,deep记录当前深度。当遇到叶子节点时而且当前深度比最大深度还大则更换最…...

【开源免费】基于SpringBoot+Vue.JS服装销售平台(JAVA毕业设计)

博主说明:本文项目编号 T 054 ,文末自助获取源码 \color{red}{T054,文末自助获取源码} T054,文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析…...

人工智能与自然语言处理发展史

前言 在科技的浪潮中,人工智能 (AI) 作为一股不可阻挡的力量,持续推动着社会与科技的进步。本博客旨在深入剖析人工智能及其核心领域——神经网络、自然语言处理、统计语言模型、以及大规模语言模型——的演进历程,以专业的视角展现这一领域…...

0基础跟德姆(dom)一起学AI 机器学习01-机器学习概述

【知道】人工智能 - Artificial Intelligence 人工智能 - AI is the field that studies the synthesis and analysis of computational agents that act intelligently - AI is to use computers to analog and instead of human brain - 释义 - 仿智; 像人…...

yakit使用教程(一,下载并进行基础配置)

一,yakit简介 YAKIT(Yet Another Knife for IT Security)是一款网络安全单兵工具,专为个人渗透测试员和安全研究人员设计。它整合了一系列实用的安全工具,例如密码破解工具、网络扫描器、漏洞利用工具等,帮…...

计算机毕业设计电影票购买网站 在线选票选座 场次订票统计 新闻留言搜索/springboot/javaWEB/J2EE/MYSQL数据库/vue前后分离小程序

系统功能 ‌在线选票选座‌:用户可浏览电影场次,选择座位并生成订单。‌场次订票统计‌:系统实时统计各场次订票情况,便于影院管理。‌新闻发布与留言‌:发布最新电影资讯,用户可留言互动。‌搜索功能‌&a…...

DES、3DES 算法及其应用与安全性分析

一、引言 1.1 研究背景 在当今数字化时代,信息安全至关重要。对称加密算法作为信息安全领域的重要组成部分,发挥着关键作用。DES(Data Encryption Standard)作为早期的对称加密算法,由美国国家标准局于 1977 年采纳为数据加密标准。随着计算机运算能力的不断增强,DES 算…...

TypeScript介绍和安装

TypeScript介绍 TypeScript是由微软开发的一种编程语言,它在JavaScript的基础上增加了静态类型检查。静态类型允许开发者在编写代码时指定变量和函数的类型,这样可以在编译时捕获潜在的错误,而不是等到运行时才发现问题。比如,你…...

NetworkPolicy访问控制

NetworkPolicy是Kubernetes中一种用于控制Pod之间以及Pod与外部网络之间流量的资源对象。它可以帮助你在 IP 地址或端口层面(OSI 第 3 层或第 4 层)控制网络流量。NetworkPolicy 资源使用标签选择 Pod,并定义选定 Pod 所允许的通信规则。它可…...

C++面向对象基础

目录 一.作用域限定符 1.名字空间 2.类内声明,类外定义 二.this指针 1 概念 2.功能 2.1 类内调用成员 2.2 区分重名的成员变量和局部变量 2.3链式调用 三.stastic关键字 1.静态局部变量 2 静态成员变量 3 静态成员函数 4 单例设计模式(了解…...

遥感图像变换检测实践上手(TensorRT+UNet)

目录 简介 分析PyTorch示例 onnx模型转engine 编写TensorRT推理代码 main.cpp测试代码 小结 简介 这里通过TensorRTUNet,在Linux下实现对遥感图像的变化检测,示例如下: 可以先拉去代码:RemoteChangeDetection 分析PyTorch示…...

Transformers 引擎,vLLM 引擎,Llama.cpp 引擎,SGLang 引擎,MLX 引擎

1. Transformers 引擎 开发者:Hugging Face主要功能:Transformers 库提供了对多种预训练语言模型的支持,包括 BERT、GPT、T5 等。用户可以轻松加载模型进行微调或推理。特性: 多任务支持:支持文本生成、文本分类、问答…...

牛顿迭代法求解x 的平方根

牛顿迭代法是一种可以用来快速求解函数零点的方法。 为了叙述方便,我们用 C C C表示待求出平方根的那个整数。显然, C C C的平方根就是函数 f ( x ) x c − C f(x)x^c-C f(x)xc−C 的零点。 牛顿迭代法的本质是借助泰勒级数,从初始值开始快…...

端口隔离配置的实验

端口隔离配置是一种网络安全技术,用于在网络设备中实现不同端口之间的流量隔离和控制。以下是对端口隔离配置的详细解析: 基本概念:端口隔离技术允许用户将不同的端口加入到隔离组中,从而实现这些端口之间的二层数据隔离。这种技…...

洛谷 P10456 The Pilots Brothers‘ refrigerator

[Problem Discription] \color{blue}{\texttt{[Problem Discription]}} [Problem Discription] 给定一个 4 4 4 \times 4 44 的网格,每个网格有 0 , 1 0,1 0,1 两种状态。求最少可以通过多少次操作使得整个网格全部变成 1 1 1。 每次操作你需要选定一个格点 …...

windows+vscode+arm-gcc+openocd+daplink开发arm单片机程序

windowsvscodearm-gccopenocddaplink开发arm单片机程序,脱离keil。目前发现的最佳解决方案是,使用vscodeembedded ide插件。 Embedded IDE官方教程文档...

Mysql梳理10——使用SQL99实现7中JOIN操作

10 使用SQL99实现7中JOIN操作 10.1 使用SQL99实现7中JOIN操作 本案例的数据库文件分享: 通过百度网盘分享的文件:atguigudb.sql 链接:https://pan.baidu.com/s/1iEAJIl0ne3Y07kHd8diMag?pwd2233 提取码:2233 # 正中图 SEL…...

24.9.27学习笔记

Xavier初始化,也称为Glorot初始化,是一种在训练深度神经网络时用于初始化网络权重的策略。它的核心思想是在网络的每一层保持前向传播和反向传播时的激活值和梯度的方差尽可能一致,以避免梯度消失或梯度爆炸的问题。这种方法特别适用于激活函…...