六十天前端强化训练之第十四天之深入理解JavaScript异步编程
=====欢迎来到编程星辰海的博客讲解======
目录
一、异步编程的本质与必要性
1.1 单线程的JavaScript运行时
1.2 阻塞与非阻塞的微观区别
1.3 异步操作的性能代价
二、事件循环机制深度解析
2.1 浏览器环境的事件循环架构
核心组件详解:
2.2 执行顺序实战分析
2.3 Node.js事件循环特殊机制
三、Promise技术全解
3.1 Promise实现原理
状态机模型:
3.2 链式调用实现机制
3.3 错误传播机制
四、async/await底层原理
4.1 Generator函数基础
4.2 协程(Coroutine)实现
4.3 async函数的编译转换
五、高级异步模式
5.1 竞态条件处理
5.2 请求取消机制
5.3 高阶异步函数
六、浏览器异步API全景图
6.1 定时器家族
6.2 Web Workers通信
七、Node.js异步特色
7.1 非阻塞I/O实现
7.2 文件系统操作对比
7.3 Stream处理大文件
八、性能优化关键点
8.1 避免Promise内存泄漏
8.2 合理控制并发量
8.3 定时器优化策略
九、调试技巧与工具
9.1 Chrome DevTools功能
9.2 Node.js调试方法
9.3 可视化分析工具
十、企业级应用实践
10.1 错误监控体系
10.2 服务端渲染中的异步处理
十一、浏览器与Node.js事件循环差异对比
11.1 执行上下文区别
11.2 定时器精度实验
十二、异步编程设计模式
12.1 发布订阅模式
12.2 管道模式
十三、异步状态管理挑战
13.1 Redux异步方案对比
13.2 状态时序问题示例
十四、Web Worker高级应用
14.1 线程池实现
十五、TypeScript异步增强
15.1 异步类型标注
15.2 异步工具类型
十六、性能优化进阶
16.1 内存泄漏检测
16.2 CPU Profiling技巧
十七、测试异步代码
17.1 Jest异步测试模式
17.2 Mock异步依赖
十八、前沿异步技术展望
18.1 Top-Level Await
18.2 WebAssembly异步集成
一、异步编程的本质与必要性
1.1 单线程的JavaScript运行时
- V8引擎的单线程特性
- 主线程执行栈的运作原理
- 为什么需要异步模型:
- 避免UI冻结(浏览器场景)
- 处理高并发I/O(Node.js场景)
- 有效利用硬件资源
1.2 阻塞与非阻塞的微观区别
JAVASCRIPT
// 同步阻塞示例 function syncReadFile() {const data = fs.readFileSync('largefile.txt'); // 阻塞点console.log(data);console.log('后续操作'); // 长时间等待后才执行 }// 异步非阻塞示例 function asyncReadFile() {fs.readFile('largefile.txt', (err, data) => {console.log(data);});console.log('后续操作'); // 立即执行 }
1.3 异步操作的性能代价
- 上下文切换成本
- 内存占用分析
- 回调队列管理开销
- 与多线程模型的对比:
特性 异步单线程 多线程模型 内存占用 较低 较高(线程堆栈开销) 开发复杂度 较高(回调地狱) 中等(需处理锁问题) CPU密集型任务 不适用 适用 I/O密集型任务 优势明显 需要大量线程
二、事件循环机制深度解析
2.1 浏览器环境的事件循环架构

核心组件详解:
-
调用栈(Call Stack)
- FILO(先进后出)结构
- 执行上下文管理
- 栈溢出保护机制
-
任务队列(Task Queue)
- 宏任务类型:
- setTimeout/setInterval
- I/O操作
- UI渲染
- 事件回调(click等)
- 先进先出(FIFO)执行
- 宏任务类型:
-
微任务队列(Microtask Queue)
- 优先级高于宏任务
- 包含:
- Promise.then
- MutationObserver
- queueMicrotask
- 执行时机:每个宏任务执行后清空
2.2 执行顺序实战分析
JAVASCRIPT
console.log('脚本启动');setTimeout(() => console.log('定时器回调'), 0);Promise.resolve().then(() => console.log('Promise微任务1')).then(() => console.log('Promise微任务2'));queueMicrotask(() => console.log('直接微任务'));console.log('脚本结束');/* 输出顺序:脚本启动脚本结束Promise微任务1直接微任务Promise微任务2定时器回调 */
2.3 Node.js事件循环特殊机制
- 阶段划分:
- timers(定时器阶段)
- pending callbacks(系统回调)
- idle, prepare(内部使用)
- poll(轮询阶段)
- check(setImmediate)
- close callbacks
- process.nextTick专用队列
- setImmediate与setTimeout(0)的区别
三、Promise技术全解
3.1 Promise实现原理
状态机模型:
TYPESCRIPT
enum PromiseState {PENDING,FULFILLED,REJECTED }class MyPromise {private state: PromiseState = PENDING;private value: any;private handlers: Function[] = [];constructor(executor) {const resolve = (value) => {if (this.state !== PENDING) return;this.state = FULFILLED;this.value = value;this.handlers.forEach(h => h());};const reject = (reason) => {if (this.state !== PENDING) return;this.state = REJECTED;this.value = reason;this.handlers.forEach(h => h());};try {executor(resolve, reject);} catch (e) {reject(e);}}then(onFulfilled, onRejected) {return new MyPromise((resolve, reject) => {const handler = () => {try {const callback = this.state === FULFILLED ? onFulfilled : onRejected;const result = callback(this.value);resolve(result);} catch (e) {reject(e);}};if (this.state !== PENDING) {queueMicrotask(handler);} else {this.handlers.push(handler);}});} }
3.2 链式调用实现机制
JAVASCRIPT
const promiseChain = new Promise(res => res(1)).then(v => {console.log(v); // 1return v * 2;}).then(v => {console.log(v); // 2return new Promise(r => setTimeout(() => r(v * 3), 1000));}).then(v => {console.log(v); // 6(1秒后输出)});/*执行过程解析:1. 初始promise立即resolve(1)2. 第一个then接收1,返回2(同步值)3. 第二个then接收2,返回新Promise4. 第三个then等待1秒后接收6 */
3.3 错误传播机制
JAVASCRIPT
function riskyOperation() {return new Promise((resolve, reject) => {if (Math.random() > 0.5) {resolve('Success');} else {reject(new Error('Random failure'));}}); }riskyOperation().then(result => {console.log('第一阶段成功:', result);return result.toUpperCase(); // 可能抛出TypeError}).then(null, err => { // 捕获前序错误console.warn('第一阶段错误:', err.message);return 'Fallback Value';}).then(finalResult => {console.log('最终结果:', finalResult);}).catch(finalError => { // 兜底捕获console.error('未处理的错误:', finalError);});
四、async/await底层原理
4.1 Generator函数基础
JAVASCRIPT
function* asyncGenerator() {const data1 = yield fetchData1();const data2 = yield fetchData2(data1);return processData(data2); }// 手动执行器 const gen = asyncGenerator(); gen.next().value.then(data1 => gen.next(data1).value).then(data2 => gen.next(data2).value).then(final => console.log(final));
4.2 协程(Coroutine)实现
- 执行权移交机制
- 上下文保留与恢复
- 与线程调度的区别
4.3 async函数的编译转换
Babel转译示例:
JAVASCRIPT
// 原始代码 async function example() {const a = await getA();const b = await getB(a);return a + b; }// 转译结果 function example() {return _asyncToGenerator(function* () {const a = yield getA();const b = yield getB(a);return a + b;})(); }function _asyncToGenerator(fn) {return function () {const gen = fn.apply(this, arguments);return new Promise((resolve, reject) => {function step(key, arg) {try {const { value, done } = gen[key](arg);if (done) {resolve(value);} else {Promise.resolve(value).then(val => step("next", val),err => step("throw", err));}} catch (error) {reject(error);}}step("next");});}; }
五、高级异步模式
5.1 竞态条件处理
JAVASCRIPT
let lastRequestId = 0;async function search(query) {const requestId = ++lastRequestId;const result = await fetch(`/api?q=${query}`);if (requestId !== lastRequestId) {throw new Error('Obsolete request');}return result.json(); }// 使用示例 input.addEventListener('input', async () => {try {const results = await search(input.value);renderResults(results);} catch (err) {if (err.message !== 'Obsolete request') {showError(err);}} });
5.2 请求取消机制
JAVASCRIPT
const abortController = new AbortController();async function fetchWithCancel() {try {const response = await fetch('/api/data', {signal: abortController.signal});return response.json();} catch (err) {if (err.name === 'AbortError') {console.log('请求被主动取消');} else {throw err;}} }// 取消请求 abortController.abort();
5.3 高阶异步函数
JAVASCRIPT
function retry(asyncFn, times = 3, delay = 1000) {return async function (...args) {let lastError;for (let i = 0; i < times; i++) {try {return await asyncFn(...args);} catch (err) {lastError = err;await new Promise(r => setTimeout(r, delay));}}throw lastError;}; }// 使用示例 const reliableFetch = retry(fetch, 3); reliableFetch('https://api.example.com/data');
六、浏览器异步API全景图
6.1 定时器家族
| API | 精度 | 最小间隔 | 适用场景 |
|---|---|---|---|
| setTimeout | 一般(4ms) | 1ms | 单次延迟任务 |
| setInterval | 一般 | 1ms | 周期重复任务 |
| requestAnimationFrame | 高(~16ms) | 屏幕刷新率 | 动画场景 |
| queueMicrotask | 立即 | 无延迟 | Promise回调 |
| requestIdleCallback | 低 | 50ms | 后台低优先级任务 |
6.2 Web Workers通信
JAVASCRIPT
// 主线程 const worker = new Worker('worker.js'); worker.postMessage({ type: 'CALC', data: bigArray });worker.onmessage = (e) => {console.log('计算结果:', e.data.result); };// worker.js self.onmessage = (e) => {if (e.data.type === 'CALC') {const result = heavyCalculation(e.data.data);self.postMessage({ result });} };
七、Node.js异步特色
7.1 非阻塞I/O实现

7.2 文件系统操作对比
JAVASCRIPT
// 同步版本 try {const data = fs.readFileSync('file.txt');console.log(data); } catch (err) {console.error(err); }// 异步回调版本 fs.readFile('file.txt', (err, data) => {if (err) return console.error(err);console.log(data); });// Promise版本 fs.promises.readFile('file.txt').then(console.log).catch(console.error);// async/await版本 async function readFile() {try {const data = await fs.promises.readFile('file.txt');console.log(data);} catch (err) {console.error(err);} }
7.3 Stream处理大文件
JAVASCRIPT
const readStream = fs.createReadStream('input.mp4'); const writeStream = fs.createWriteStream('output.mp4');readStream.on('data', (chunk) => {writeStream.write(transformChunk(chunk));}).on('end', () => {writeStream.end();console.log('文件处理完成');}).on('error', (err) => {console.error('处理失败:', err);});
八、性能优化关键点
8.1 避免Promise内存泄漏
JAVASCRIPT
// 错误示例:未处理的Promise链 function leakyOperation() {fetchData() // 返回Promise.then(processData) // 未处理可能的拒绝.then(updateUI); }// 正确做法: function safeOperation() {fetchData().then(processData).then(updateUI).catch(err => console.error('处理失败:', err)); }
8.2 合理控制并发量
JAVASCRIPT
async function controlledConcurrency(tasks, maxConcurrent = 5) {const results = [];const executing = new Set();for (const task of tasks) {const p = task();executing.add(p);p.finally(() => executing.delete(p));if (executing.size >= maxConcurrent) {await Promise.race(executing);}}return Promise.all(tasks.map(t => t())); }// 使用示例 const fetchTasks = Array(20).fill(() => fetch('https://api.example.com/data')); controlledConcurrency(fetchTasks);
8.3 定时器优化策略
JAVASCRIPT
// 不良实践:高频定时器 setInterval(() => {updateAnimation(); // 可能造成帧丢失 }, 10);// 优化方案:使用rAF function animate() {updateAnimation();requestAnimationFrame(animate); } animate();// 需要精确计时时: let lastTime = Date.now(); function preciseUpdate() {const now = Date.now();const delta = now - lastTime;if (delta >= 1000/60) { // 60FPSupdateLogic(delta);lastTime = now;}requestAnimationFrame(preciseUpdate); }
九、调试技巧与工具
9.1 Chrome DevTools功能
- 异步堆栈追踪:勾选"Async"选项
- Performance面板:分析任务调度
- Console面板:直接调试Promise
JAVASCRIPT
// 将Promise保留为全局变量 const globalPromise = fetchData();// 在控制台输入: await globalPromise;
9.2 Node.js调试方法
BASH
# 启动调试 node --inspect-brk app.js# Chrome访问 chrome://inspect
9.3 可视化分析工具
- JS Visualizer 9000
- Promisees
- LatentFlip Event Loop
十、企业级应用实践
10.1 错误监控体系
JAVASCRIPT
// 全局Promise错误捕获 window.addEventListener('unhandledrejection', event => {sendToMonitoring({type: 'UNHANDLED_REJECTION',reason: event.reason,stack: event.reason.stack}); });// async函数统一错误处理 async function safeAsync(fn) {try {return await fn();} catch (err) {captureException(err);throw err; // 保持原有行为} }// 使用示例 safeAsync(() => fetchCriticalData());
10.2 服务端渲染中的异步处理
JAVASCRIPT
async function serverRender(req) {const dataPromise = fetchSSRData(req);const templatePromise = readTemplateFile();const [data, template] = await Promise.all([dataPromise,templatePromise]);return renderToString(<App data={data} template={template} />); }
十一、浏览器与Node.js事件循环差异对比
11.1 执行上下文区别
| 环境特征 | 浏览器环境 | Node.js环境 |
|---|---|---|
| 全局对象 | window | global |
| 微任务执行时机 | 每个宏任务后 | 每个阶段切换时 |
| 优先级任务类型 | 动画回调优先 | I/O回调优先 |
| 典型阻塞操作 | 长时间JS执行 | 同步文件操作 |
| 进程模型 | 多进程(标签页独立) | 单进程多线程 |
11.2 定时器精度实验
JAVASCRIPT
// 精度测试代码 function testTimerAccuracy() {const start = Date.now();setTimeout(() => {const end = Date.now();console.log(`实际延迟: ${end - start}ms`);}, 100); }// 浏览器典型输出:实际延迟: 104ms // Node.js典型输出:实际延迟: 105ms
十二、异步编程设计模式
12.1 发布订阅模式
JAVASCRIPT
class AsyncEventEmitter {constructor() {this.events = new Map();}on(event, listener) {if (!this.events.has(event)) {this.events.set(event, []);}this.events.get(event).push(listener);}async emit(event, ...args) {const listeners = this.events.get(event) || [];for (const listener of listeners) {await listener(...args);}} }// 使用示例 const db = new AsyncEventEmitter();db.on('query', async (sql) => {console.log(`执行查询: ${sql}`);await new Promise(r => setTimeout(r, 100)); });db.emit('query', 'SELECT * FROM users');
12.2 管道模式
JAVASCRIPT
function createAsyncPipeline(...middlewares) {return function(input) {return middlewares.reduce((chain, middleware) => chain.then(middleware), Promise.resolve(input));}; }// 中间件示例 const validateInput = data => {if (!data.userId) throw new Error('Missing userId');return data; };const fetchUser = data => fetch(`/users/${data.userId}`).then(res => res.json());const processData = user => ({...user,name: user.name.toUpperCase() });// 组合管道 const userPipeline = createAsyncPipeline(validateInput,fetchUser, processData );userPipeline({ userId: 123 }).then(console.log).catch(console.error);
十三、异步状态管理挑战
13.1 Redux异步方案对比
| 方案 | 优点 | 缺点 |
|---|---|---|
| Redux-Thunk | 简单易用 | 回调地狱风险 |
| Redux-Saga | 强大异步控制 | 学习曲线陡峭 |
| Redux-Observable | 响应式编程优势 | RxJS知识依赖 |
| RTK Query | 内置缓存/自动管理 | 灵活性相对受限 |
13.2 状态时序问题示例
JAVASCRIPT
let currentSearchId = 0;async function handleSearch(input) {const searchId = ++currentSearchId;const results = await fetchResults(input);// 检查是否为最新请求if (searchId !== currentSearchId) {console.log('过时结果已丢弃');return;}updateUI(results); }// 输入频繁触发时,只保留最后一次结果 searchInput.addEventListener('input', e => handleSearch(e.target.value));
十四、Web Worker高级应用
14.1 线程池实现
JAVASCRIPT
class WorkerPool {constructor(size = navigator.hardwareConcurrency || 4) {this.pool = Array(size).fill().map(() => ({worker: new Worker('worker.js'),busy: false}));}exec(taskData) {const freeWorker = this.pool.find(w => !w.busy);if (!freeWorker) {return Promise.reject('All workers busy');}freeWorker.busy = true;return new Promise((resolve, reject) => {freeWorker.worker.onmessage = e => {freeWorker.busy = false;resolve(e.data);};freeWorker.worker.postMessage(taskData);});} }// 使用示例 const pool = new WorkerPool(); pool.exec({type: 'imageProcess', data: imageBuffer}).then(processed => updateImage(processed));
14.2 SharedArrayBuffer通信
JAVASCRIPT
// 主线程 const sharedBuffer = new SharedArrayBuffer(1024); const view = new Uint8Array(sharedBuffer);worker.postMessage({ buffer: sharedBuffer });// Worker线程 self.onmessage = function(e) {const sharedView = new Uint8Array(e.data.buffer);Atomics.add(sharedView, 0, 1); // 线程安全操作 };
十五、TypeScript异步增强
15.1 异步类型标注
TYPESCRIPT
interface User {id: number;name: string; }// 明确标注异步函数返回类型 async function fetchUser(id: number): Promise<User> {const response = await fetch(`/users/${id}`);return response.json(); }// 处理可能为null的情况 async function findUser(name: string): Promise<User | null> {try {const users = await fetchUsers();return users.find(u => u.name === name) || null;} catch {return null;} }
15.2 异步工具类型
TYPESCRIPT
type AsyncReturnType<T> = T extends (...args: any[]) => Promise<infer R> ? R : never;async function getData(): Promise<string[]> {return ['a', 'b', 'c']; }type DataType = AsyncReturnType<typeof getData>; // string[]// 高级类型组合 interface ApiResponse<T> {data: T;status: number; }async function fetchApi<T>(url: string): Promise<ApiResponse<T>> {// 实现... }type UserResponse = ApiResponse<User>;
十六、性能优化进阶
16.1 内存泄漏检测
Chrome Memory面板操作步骤:
- 录制堆内存快照
- 执行可疑操作多次
- 再次录制并对比
- 查看Retained Size异常的Promise对象
- 检查未释放的事件监听器
16.2 CPU Profiling技巧
JAVASCRIPT
// 标记时间线 console.time('criticalSection'); await performCriticalOperation(); console.timeEnd('criticalSection');// 性能分析包裹函数 function profile(target, name, descriptor) {const original = descriptor.value;descriptor.value = async function(...args) {const start = performance.now();const result = await original.apply(this, args);console.log(`${name}耗时: ${performance.now() - start}ms`);return result;};return descriptor; }class DataService {@profileasync loadAllData() {// 数据加载逻辑} }
十七、测试异步代码
17.1 Jest异步测试模式
JAVASCRIPT
// 回调风格 test('fetch data with callback', done => {fetchData((err, data) => {expect(err).toBeNull();expect(data).toHaveProperty('id');done();}); });// Promise风格 test('fetch data with promise', () => {return fetchData().then(data => {expect(data.status).toBe(200);}); });// async/await风格 test('async/await test', async () => {const data = await fetchData();expect(data.items).toHaveLength(10); });
17.2 Mock异步依赖
JAVASCRIPT
// Mock定时器 jest.useFakeTimers();test('debounce works', async () => {const mockFn = jest.fn();const debounced = debounce(mockFn, 100);debounced();debounced();jest.runAllTimers();expect(mockFn).toHaveBeenCalledTimes(1); });// Mock API请求 jest.mock('axios');test('fetch user', async () => {axios.get.mockResolvedValue({ data: { id: 1, name: 'Test' } });const user = await fetchUser(1);expect(user.name).toBe('Test'); });
十八、前沿异步技术展望
18.1 Top-Level Await
JAVASCRIPT
// 模块顶层直接使用await const data = await fetchConfig(); export const config = process.env.NODE_ENV === 'production' ? data.prod : data.dev;// 动态导入结合 const localeData = await import(`./locales/${navigator.language}.js`);
18.2 WebAssembly异步集成
JAVASCRIPT
async function initWasm() {const imports = {env: {async_log: async (msgPtr) => {const msg = wasmModule.getString(msgPtr);await sendLogToServer(msg);}}};const { instance } = await WebAssembly.instantiateStreaming(fetch('module.wasm'),imports);return instance.exports; }const wasmExports = await initWasm(); wasmExports.compute();
本文通过系统化的知识体系构建、丰富的代码示例和实际应用场景分析,全景式展示了JavaScript异步编程的深度与广度。建议读者按照以下步骤进行实践:
- 在Chrome中运行所有示例代码,使用调试工具观察执行流程
- 在现有项目中实施至少三种优化策略
- 构建一个包含完整错误处理机制的异步应用
- 对关键异步代码段进行性能剖析和测试
- 尝试将回调风格代码逐步重构为async/await形式
持续关注TC39提案和浏览器/Node.js的版本更新,异步编程领域仍在快速发展中,新的模式和API将不断涌现。
相关文章:
六十天前端强化训练之第十四天之深入理解JavaScript异步编程
欢迎来到编程星辰海的博客讲解 目录 一、异步编程的本质与必要性 1.1 单线程的JavaScript运行时 1.2 阻塞与非阻塞的微观区别 1.3 异步操作的性能代价 二、事件循环机制深度解析 2.1 浏览器环境的事件循环架构 核心组件详解: 2.2 执行顺序实战分析 2.3 Nod…...
利用EasyCVR平台打造化工园区视频+AI智能化监控管理系统
化工园区作为化工产业的重要聚集地,其安全问题一直是社会关注的焦点。传统的人工监控方式效率低下且容易出现疏漏,已经难以满足日益增长的安全管理需求。 基于EasyCVR视频汇聚平台构建的化工园区视频AI智能化应用方案,能够有效解决这些问题&…...
【VUE2】第三期——样式冲突、组件通信、异步更新
目录 1 scoped解决样式冲突 2 data写法 3 组件通信 3.1 父子关系 3.1.1 父向子传值 props 3.1.2 子向父传值 $emit 3.2 非父子关系 3.2.1 event bus 事件总线 3.2.2 跨层级共享数据 provide&inject 4 props 4.1 介绍 4.2 props校验完整写法 5 v-model原理 …...
深度学习分类回归(衣帽数据集)
一、步骤 1 加载数据集fashion_minst 2 搭建class NeuralNetwork模型 3 设置损失函数,优化器 4 编写评估函数 5 编写训练函数 6 开始训练 7 绘制损失,准确率曲线 二、代码 导包,打印版本号: import matplotlib as mpl im…...
深入解析ECDSA与RSA公钥算法:原理、对比及AWS最佳实践
一、公钥加密算法概述 在HTTPS通信和数字证书领域,ECDSA(椭圆曲线数字签名算法)和RSA(Rivest-Shamir-Adleman)是最主流的两种非对称加密算法。它们共同构成了现代网络安全的基础,但设计理念和技术实现存在显著差异。 © ivwdcwso (ID: u012172506) 二、RSA算法详解…...
preloaded-classes裁剪
系统预加载了哪些class类?system/etc/preloaded-classes 修改源代码? frameworks\base\config\preloaded-classes 默认位置,如果改了不生效,可能有其它模块的mk文件指定了preloaded-classes覆盖了framework模块,例如…...
在Linux中开发OpenGL——检查开发环境对OpenGL ES的支持
由于移动端GPU规模有限,厂商并没有实现完整的OpenGL特性,而是实现了它的子集——OpenGL ES。因此如果需要开发的程序要支持移动端平台,最好使用OpenGL ES开发。 1、 下载支持库、OpenGL ES Demo 1.1、下载PowerVRSDK支持库作为准备ÿ…...
HJ C++11 Day2
Initializer Lists 对于一个类P class P{P(int a, int b){cout << "P(int, int), a" << a << ", b " << b << endl;}P(initializer_list<int> initlist){cout << "P(initializer_list<int>), val…...
基于Spring Boot的学院商铺管理系统的设计与实现(LW+源码+讲解)
专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…...
os-copilot安装和使用体验测评
简介: OS Copilot是阿里云基于大模型构建的Linux系统智能助手,支持自然语言问答、命令执行和系统运维调优。本文介绍其产品优势、功能及使用方法,并分享个人开发者在云服务器资源管理中的实际应用体验。通过-t/-f/管道功能,OS Cop…...
Geo3D建筑材质切换+屋顶纹理
一、简介 基于Threejs开发封装建筑渲染管线,利用简单二维建筑矢量面轮廓程序化生成3D建筑,支持材质一键切换,支持多样化建筑墙面材质和屋顶材质,支持建筑透明,支持地形高程适配,支持按空间范围裁剪挖洞等。…...
工程化与框架系列(24)--跨平台解决方案
跨平台解决方案 🌐 引言 随着移动互联网的发展,跨平台开发已成为前端开发的重要趋势。本文将深入探讨前端跨平台开发的各种解决方案,包括响应式设计、混合开发、原生开发等方案,帮助开发者选择合适的跨平台策略。 跨平台开发概…...
快手,得物,三七互娱,科锐国际,作业帮等25春招内推
得物,三七互娱,快手,作业帮,科锐国际26届实习内推 ①快手 【在招岗位】运营、市场、产品、战略分析、职能、工程、设计、算法、项目管理、销售、游戏等类 【一键内推】https://sourl.cn/Qi5pm2 【内推码】campuswQrLOMvHE ②得物 …...
【GPT入门】第9课 思维树概念与原理
【GPT入门】第9课 思维树概念与原理 1.思维树概念与原理2. 算24游戏的方法 1.思维树概念与原理 思维树(Tree of Thought,ToT )是一种大模型推理框架,旨在解决更加复杂的多步骤推理任务,让大模型能够探索多种可能的解决…...
SolidWorks 转 PDF3D 技术详解
在现代工程设计与制造流程中,不同软件间的数据交互与格式转换至关重要。将 SolidWorks 模型转换为 PDF3D 格式,能有效解决模型展示、数据共享以及跨平台协作等问题。本文将深入探讨 SolidWorks 转 PDF3D 的技术原理、操作流程及相关注意事项,…...
栈概念和结构
文章目录 1. 栈的概念2. 栈的分类3. 栈的实现(数组栈)3.1 接口设计(Stack.h)3.2 接口实现(Stack.c)1)初始化销毁2)栈顶插入删除3)栈顶元素、空栈、大小 3.3 完整代码Stac…...
Trae 是一款由 AI 驱动的 IDE,让编程更加愉悦和高效。国际版集成了 GPT-4 和 Claude 3.5,国内版集成了DeepSeek-r1
Trae 是一款由 AI 驱动的 IDE,让编程更加愉悦和高效。国际版集成了 GPT-4 和 Claude 3.5,国内版继承了DeepSeek-r1,支持实时代码建议和无缝 GitHub 集成。 当前国内和国际版的AI都是免费的。 安装 国际版安装 国际版下载:下载…...
Spring (八)AOP-切面编程的使用
目录 实现步骤: 1 导入AOP依赖 2 编写切面Aspect 3 编写通知方法 4 指定切入点表达式 5 测试AOP动态织入 图示: 实现步骤: 1 导入AOP依赖 <!-- Spring Boot AOP依赖 --><dependency><groupId>org.springframework.b…...
VS Code连接服务器教程
VS Code是什么 VS Code(全称 Visual Studio Code)是一款由微软推出的免费、开源、跨平台的代码编辑神器。VS Code 支持 所有主流操作系统,拥有强大的功能和灵活的扩展性。 官网:https://code.visualstudio.com/插件市场࿱…...
leetcode69.x 的平方根
题目: 给你一个非负整数 x ,计算并返回 x 的 算术平方根 。 由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。 注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。…...
HttpServletRequest 和 HttpServletResponse 区别和作用
一、核心作用对比 对象HttpServletRequest(请求对象)HttpServletResponse(响应对象)本质客户端发给服务器的 HTTP 请求信息(输入)服务器返回客户端的 HTTP 响应信息(输出)生命周期一…...
国家二级运动员证书有什么用·棒球1号位
以棒球运动为例,国家二级棒球运动员证书是由中国国家体育总局颁发的运动员技术等级认证,主要作用体现在以下几个方面: 一、升学优势 体育特招资格:符合条件者可报考高校高水平运动队或体育单招,部分院校对二级运动员有…...
Windsuf 连接失败问题:[unavailable] unavailable: dial tcp...
问题描述 3月6日,在使用Windsuf 时,遇到以下网络连接错误: [unavailable] unavailable: dial tcp 35.223.238.178:443: connectex: A connection attempt failed because the connected party did not properly respond after a period of…...
docker中kibana启动后,通过浏览器访问,出现server is not ready yet
问题:当我在浏览器访问kibana时,浏览器给我报了server is not ready yet. 在网上试了很多方法,都未能解决,下面是我的方法: 查看kibana日志: docker logs -f kibana从控制台打印的日志可以发现ÿ…...
更多文章请查看
更多文章知识请移步至下面链接,期待你的关注 如需查看新文章,请前往: 博主知识库https://www.yuque.com/xinzaigeek...
(十 九)趣学设计模式 之 中介者模式!
目录 一、 啥是中介者模式?二、 为什么要用中介者模式?三、 中介者模式的实现方式四、 中介者模式的优缺点五、 中介者模式的应用场景六、 总结 🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方式,…...
博弈论算法
一、减法游戏 初始有一个数 n。 两个玩家轮流操作,每次可以减去 1 到 9 之间的任意整数。 将数减到 0 的玩家获胜。 可以发现规律: 减法游戏只需要判断当前数取模是否为0,即可快速判断胜负。 例题: Leetcode 292. Nim 游戏 …...
【网络】HTTP协议、HTTPS协议
HTTP与HTTPS HTTP协议概述 HTTP(超文本传输协议):工作在OSI顶层应用层,用于客户端(浏览器)与服务器之间的通信,B/S模式 无状态:每次请求独立,服务器不保存客户端状态(通…...
GitCode 助力 vue3-element-admin:开启中后台管理前端开发新征程
源码仓库: https://gitcode.com/youlai/vue3-element-admin 后端仓库: https://gitcode.com/youlai/youlai-boot 开源助力,开启中后台快速开发之旅 vue3-element-admin 是一款精心打造的免费开源中后台管理前端模板,它紧密贴合…...
网络HTTP
HTTP Network Request Library A Retrofit-based HTTP network request encapsulation library that provides simple and easy-to-use API interfaces with complete network request functionality. 基于Retrofit的HTTP网络请求封装库,提供简单易用的API接口和完…...

