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

【JS】Promise详解

概述

在 JavaScript 中,Promise 是一个表示异步操作最终完成或失败的对象。它本质上是一个返回的对象,你可以附加回调函数,而不是将回调传递给函数。

let promise = new Promise((resolve, reject) => {let condition = true; // 这可以是某个操作的结果// 1秒后检查条件并解决或拒绝 PromisesetTimeout(() => {if (condition) {resolve('Promise 已完成!');} else {reject('Promise 被拒绝!');}}, 1000);
});// 将 then() 和 catch() 处理程序附加到 Promise
promise.then(value => {// 如果 Promise 已解决,则执行此操作console.log(value); // 输出: Promise 已完成!}).catch(error => {// 如果 Promise 被拒绝,则执行此操作console.log(error);});

在这个示例中,创建了一个 Promise,它将在 1 秒后解决或拒绝,具体取决于条件的值。如果 Promise 成功,将调用 resolve 函数;如果 Promise 失败,将调用 reject 函数。

当 Promise 解决时,then 方法被调用,并接收传递给 resolve 函数的值。类似地,当 Promise 被拒绝时,catch 方法被调用,并接收传递给 reject 函数的值。

setTimeout 和事件循环

setTimeout 函数在这个问题中发挥了关键作用。它是一个方法,调用一个函数或在指定的毫秒数后评估一个表达式。在 JavaScript 中,setTimeout 用于延迟代码的执行。

console.log("启动定时器...");setTimeout(() => {console.log("定时已完成!");
}, 2000);

在这个示例中,“启动定时器…”将立即记录到控制台。然后,调用 setTimeout 函数,传递两个参数:一个回调函数和以毫秒为单位的延迟。回调函数是一个简单的箭头函数,用于将 “定时已完成!”记录到控制台,延迟为 2000 毫秒(或2秒)。

一旦调用了 setTimeout,JavaScript 运行时设置了定时器,但随后立即继续执行任何后续代码。它不会暂停或等待定时器完成,这展示了 JavaScript 的非阻塞特性。

在指定的延迟之后(在本例中为2秒),将回调函数添加到任务队列中。但重要的是要注意,回调函数不一定会在此刻立即执行。回调函数实际执行之前的实际延迟可能会比指定的延迟稍长。这是由于事件驱动的 JavaScript 运行时和单线程事件循环的性质所决定的。

假设主 JavaScript 线程中有一个耗时较长的进程或操作。在这种情况下,即使定时器在后台完成,回调函数仍必须等待阻塞任务的完成。这是因为事件循环一次只能处理一个任务,并按照排队的顺序处理任务。

因此,setTimeout 中指定的“2 秒”应被理解为在调用回调函数之前的 “最小延迟”,而不是 “保证延迟”。如果 JavaScript 运行时正忙于其他任务,回调函数实际执行的时间可能会超过 2 秒。这种行为强调了理解 JavaScript 异步性质的重要性,因为它对代码的性能和行为产生重大影响。

另外,值得一提的是 clearTimeout,这是 JavaScript 定时器函数套件中的一个有用函数。clearTimeout 是一个函数,它取消了先前通过调用 setTimeout 建立的定时器。

下面是它的使用示例:

console.log("启动定时器...");// setTimeout 返回一个 Timeout 对象,可用于引用定时器
let timeoutId = setTimeout(() => {console.log("定时已完成!");
}, 2000);// 一些条件或逻辑
if (/* 一些条件 */) {// 取消定时器clearTimeout(timeoutId);
}

如果 if 语句内部的条件为真,那么 clearTimeout 函数将取消通过 setTimeout 设置的定时器。如果取消了定时器,setTimeout 提供的函数将不会被调用。

这在各种场景中很有用,例如,如果要在操作执行之前检查用户是否仍然活跃在页面上,但用户在延迟结束之前导航到其他页面,你可以使用 clearTimeout 来取消检查。

JavaScript 的事件循环

JavaScript 使用调用堆栈来管理函数的执行。当调用函数时,它会被添加到堆栈中。当函数完成时,它会从堆栈中移除。由于 JavaScript 是单线程的,一次只能执行一个函数。

然而,如果一个函数需要较长时间才能执行(例如网络请求),这可能会有问题。这就是事件循环的用武之地。

事件循环 是一个持续的循环,检查调用堆栈是否为空。如果为空,它会从任务队列(也称为事件队列或回调队列)中获取第一个任务并将其推送到调用堆栈中,立即执行它。

异步回调

setTimeout 是 JavaScript 中的异步函数示例。当调用 setTimeout 函数时,它会启动一个定时器,然后立即返回,允许 JavaScript 运行时在等待定时器完成的同时继续执行其他代码。这是 JavaScript 的非阻塞特性。

一旦定时器完成,给 setTimeout 提供的回调函数将添加到任务队列中。事件循环不断检查调用堆栈和任务队列。当调用堆栈为空时,它会从任务队列中获取第一个任务并将其推送到调用堆栈中以执行。

并发和事件循环

以下是 JavaScript 如何处理并发操作的方式:

  1. JavaScript 运行一段代码(此代码在主线程上运行)。
  2. 当遇到异步操作(如 setTimeout、fetch 等)时,JavaScript 将其启动,然后继续运行其余代码。它不会等待异步操作完成。这些异步操作可能在后台运行,但不会运行在主 JavaScript 线程上。
  3. 当异步操作完成时,其回调函数将被放入任务队列中。
  4. 一旦调用堆栈为空(即,当前事件循环的所有代码都已执行完毕),事件循环将从任务队列中获取第一个任务并将其推送到调用堆栈中,以立即执行它。

这个过程继续进行,事件循环会在调用堆栈为空时将任务从任务队列中推送到调用堆栈,从而使 JavaScript 能够处理多个操作,尽管它是单线程的。

这是 JavaScript 处理异步操作的高级概述。实际上更复杂,还涉及微任务和宏任务等附加特性,但这是其基本概念。查看事件循环详解。

Async/await

Async/await 可以被看作是 Promise 的语法糖,它使异步代码更易于编写和理解。当我们使用 async 关键字标记函数时,它将成为一个自动返回 promise 的异步函数。在异步函数中,我们可以使用 await 关键字暂停代码的执行,直到 promise 解决或拒绝。

通过使用 await,我们可以消除使用 promises 时通常需要的明确的 .then() 和 .catch() 链。相反,我们可以以更线性和类似同步代码的方式构建代码。这使得更容易理解程序的流程并以更简洁的方式处理错误。

示例:

// 使用 promises 和显式的 .then() 和 .catch()
fetchData().then(response => {// 处理响应console.log("响应:", response);return processData(response);}).then(result => {// 处理处理后的数据console.log("处理后的数据:", result);}).catch(error => {// 处理任何错误console.error("错误:", error);});// 使用 async/await
async function fetchDataAndProcess() {try {const response = await fetchData();console.log("响应:", response);const result = await processData(response);console.log("处理后的数据:", result);} catch (error) {console.error("错误:", error);}
}
fetchDataAndProcess();

通过使用明确的 .then() 和 .catch() 链,我们必须分别处理异步操作的每个步骤。当涉及多个 promises 时,可能会变得复杂,从而导致嵌套或链接的 .then() 调用。此外,错误处理需要单独的 .catch() 块。

相比之下,第二个示例使用 async/await 在更线性和类似同步代码的方式中构建代码。fetchDataAndProcess() 函数标记为 async,允许我们在其中使用 await 关键字。这消除了明确的 .then() 和 .catch() 链的需要。

在底层,await 关键字会暂停函数的执行,使其他任务继续执行,比如处理用户输入或动画。JavaScript 引擎会切换到执行其他代码,直到由异步函数返回的 promise 解决,然后它将恢复异步函数中的其余代码的执行。

Promise 链式编程

Promise 链式编程是 JavaScript 中的一种技术,允许你按顺序执行多个异步操作,每个操作在前一个操作完成后启动。Promise 链的主要优点是,它允许你避免使用嵌套回调来处理异步代码时的 “回调地狱” 或 “回调金字塔”。相反,可以编写几乎看起来像同步代码的异步代码,从而更容易理解和维护。Promise 链中的每个 then 方法都会接收上一个 promise 解决的结果。此结果可以用来通知链中的下一个步骤。如果链中的 promise 被拒绝,后续的 then 方法将被跳过,直到找到 catch 方法来处理错误。

fetchData().then(response => {console.log("响应:", response);return processData(response);  // 这返回一个新的 promise}).then(processedData => {console.log("处理后的数据:", processedData);return furtherProcessing(processedData);  // 这返回另一个新的 promise}).then(finalResult => {console.log("最终结果:", finalResult);}).catch(error => {console.error("错误:", error);});

fetchDataprocessDatafurtherProcessing 都是异步函数,返回 promises。then 方法被链接在一起,每个 then 在前一个 promise 解决后开始其操作。如果链中的任何 promise 被拒绝,将调用最后的 catch 方法来处理错误。

理解 .finally

在 JavaScript 中,Promises 提供了处理异步操作及其结果的几种强大方法之一就是 .finally 方法。.finally 方法是 Promise 的内置方法,它始终会执行,无论 promise 是否被解决。这使得它成为放置无论 promise 结果如何都必须运行的清理代码的绝佳位置。

let isLoading = true;fetch('https://api.example.com/data').then(response => {if (!response.ok) {throw new Error('网络响应不正常');}return response.json();}).then(data => console.log(data)).catch(error => console.error('错误:', error)).finally(() => {isLoading = false;console.log('获取操作完成');});

使用 fetch(返回一个 promise)从 URL 获取数据。然后,我们使用 .then 处理响应,并使用 .catch 处理任何错误。最后,无论获取操作是否成功,都会调用 .finally 以将 isLoading 设置为 false 并在控制台上记录一条消息。

理解异步函数中的 promise 返回

在解决这个问题时,可能会派上用场的一个有趣事实是,在异步函数中,无论你是返回 return new Promise() 还是 return await new Promise(),行为通常是相同的。这是因为异步函数始终将返回值包装在 promise 中。然而,在某些情况下,如错误处理,使用 await 可能会有所不同。

思考下面的示例:

async function example() {try {return new Promise((resolve, reject) => {throw new Error('糟糕!');});} catch (err) {console.error(err);}
}example(); // 错误不会被捕获,它拒绝了 example 返回的 promise。async function example2() {try {return await new Promise((resolve, reject) => {throw new Error('糟糕!');});} catch (err) {console.error(err);}
}example2(); // 错误被捕获,example2 返回的 promise 被解决。

在 example 函数中,try 块不会捕获 promise 引发的错误,因为 promise 在引发错误之前就已经返回了。在 example2 中,await 会导致函数等待 promise 完成或抛出错误,因此它可以捕获 promise 引发的错误。

相关文章:

【JS】Promise详解

概述 在 JavaScript 中,Promise 是一个表示异步操作最终完成或失败的对象。它本质上是一个返回的对象,你可以附加回调函数,而不是将回调传递给函数。 let promise new Promise((resolve, reject) > {let condition true; // 这可以是某…...

原生微信小程序如何动态配置主题颜色及如何调用子组件的方法

一、最终效果 二、步骤 1、在初始化进入项目时,获取当前主题色 2、把主题色定义成全局变量(即在app.js中设置) 3、tabBar也需要定义全局变量,在首页时需要重新赋值 三、具体实现 1、app.js onLaunch () {//获取主题数据this.set…...

Java关键字(1)

Java中的关键字是指被编程语言保留用于特定用途的单词。这些关键字不能用作变量名或标识符。以下是Java中的一些关键字: public:表示公共的,可以被任何类访问。 private:表示私有的,只能被定义该关键字的类访问。 cl…...

【机器学习合集】深度生成模型 ->(个人学习记录笔记)

深度生成模型 深度生成模型基础 1. 监督学习与无监督学习 1.1 监督学习 定义 在真值标签Y的指导下,学习一个映射函数F,使得F(X)Y 判别模型 Discriminative Model,即判别式模型,又称为条件模型,或条件概率模型 生…...

Java将PDF转换为文本

在Java中&#xff0c;你可以使用现有的库来将PDF文件转换为文本。下面是一个简单的示例&#xff0c;使用Apache PDFBox库来实现PDF到文本的转换。首先&#xff0c;确保在你的项目中添加了Apache PDFBox库的依赖。你可以在 Maven 项目中添加以下依赖&#xff1a; <!--Pdf--&g…...

Linux 运维工具之1Panel

一、1Panel 简介 1Panel 是一个现代化、开源的 Linux 服务器运维管理面板。 特点&#xff1a; 快速建站&#xff1a;深度集成 Wordpress 和 Halo&#xff0c;域名绑定、SSL 证书配置等一键搞定&#xff1b;高效管理&#xff1a;通过 Web 端轻松管理 Linux 服务器&#xff0…...

深入了解小红书笔记详情API:为内容创新提供动力

一、小红书笔记详情API简介 小红书笔记详情API是一种允许开发者访问小红书平台上的笔记详细数据的接口。通过这个API&#xff0c;我们可以获取笔记的标题、内容、标签、点赞数、评论数等详细信息。这些数据对于内容创作者和品牌来说至关重要&#xff0c;可以帮助他们了解用户喜…...

Animate 2024(Adobe an2024)

Animate 2024是一款由Adobe公司开发的动画和互动内容创作工具&#xff0c;是Flash的演进版本。Animate 2024为设计师和开发者提供了更丰富的功能&#xff0c;让他们能够创建各种类型的动画、交互式内容和多媒体应用程序。 Animate 2024具有以下特点&#xff1a; 强大的设计工…...

尽量避免删改List

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 学习必须往深处挖&…...

【Linux操作系统】探秘Linux奥秘:用户、组、密码及权限管理的解密与实战

&#x1f308;个人主页&#xff1a;Sarapines Programmer&#x1f525; 系列专栏&#xff1a;《操作系统实验室》&#x1f516;诗赋清音&#xff1a;柳垂轻絮拂人衣&#xff0c;心随风舞梦飞。 山川湖海皆可涉&#xff0c;勇者征途逐星辉。 目录 &#x1fa90;1 初识Linux OS &…...

计算机组成原理复习4

习题 练习题 下列不属于系统总线的为&#xff08;&#xff09; a.数据总线 b.地址总线 c.控制总线 d.片内总线 D 系统总线中地址总线的功能是&#xff08;&#xff09; a.选择主存单元地址 b.选择进行信息传输的设备 c.选择外存地址 d.指定主存和I/O设备接口电路的地址 D 解…...

AutoSAR(基础入门篇)3.3-Autosar中RTE的数据一致性与Interface接口

目录 一、RTE的数据一致性 1、什么是数据一致性 2、数据一致性的实现机制 2.1、利用RTE管理<...

超维空间S2无人机使用说明书——52、初级版——使用PID算法进行基于yolo的目标跟踪

引言&#xff1a;在实际工程项目中&#xff0c;为了提高系统的响应速度和稳定性&#xff0c;往往需要采用一定的控制算法进行目标跟踪。这里抛砖引玉&#xff0c;仅采用简单的PID算法进行目标的跟随控制&#xff0c;目标的识别依然采用yolo。对系统要求更高的&#xff0c;可以对…...

<JavaEE> TCP 的通信机制(一) -- 确认应答 和 超时重传

目录 TCP的通信机制的核心特性 一、确认应答 1&#xff09;什么是确认应答&#xff1f; 2&#xff09;如何“确认”&#xff1f; 3&#xff09;如何“应答”&#xff1f; 二、超时重传 1&#xff09;丢包的概念 2&#xff09;什么是超时重传&#xff1f; 3&#xff09…...

Spark任务调度与数据本地性

Apache Spark是一个分布式计算框架&#xff0c;用于处理大规模数据。了解Spark任务调度与数据本地性是构建高效分布式应用程序的关键。本文将深入探讨Spark任务调度的流程、数据本地性的重要性&#xff0c;并提供丰富的示例代码来帮助大家更好地理解这些概念。 Spark任务调度的…...

【论文阅读】Self-Paced Curriculum Learning

论文下载 代码 Supplementary Materials bib: INPROCEEDINGS{,title {Self-Paced Curriculum Learning},author {Lu Jiang and Deyu Meng and Qian Zhao and Shiguang Shan and Alexander Hauptmann},booktitle {AAAI},year {2015},pages {2694--2700} }1. 摘…...

C++简易线程池

原理说明&#xff1a; 1. 线程池创建时&#xff0c;指定线程池的大小thread_size。当有新的函数任务通过函数addFunction ()添加进来后&#xff0c;其中一个线程执行函数。一个线程一次执行一个函数。如果函数数量大与线程池数量&#xff0c;则后来的函数等待。 2. 线程池内部…...

【MATLAB】PSO粒子群优化LSTM(PSO_LSTM)的时间序列预测

有意向获取代码&#xff0c;请转文末观看代码获取方式~也可转原文链接获取~ 1 基本定义 PSO粒子群优化LSTM&#xff08;PSO-LSTM&#xff09;是一种将粒子群优化算法&#xff08;PSO&#xff09;与长短期记忆神经网络&#xff08;LSTM&#xff09;相结合的混合模型。该算法通过…...

产品经理学习-怎么写PRD文档

目录 瀑布流方法论介绍 产品需求文档&#xff08;PRD&#xff09;介绍 产品需求文档的基本要素 撰写产品需求文档 优先产品需求文档的特点 其他相关文档 瀑布流方法论介绍 瀑布流模型是一种项目的开发和管理的方法论&#xff0c;是敏捷的开发管理方式相对应的另一种方法…...

第3课 获取并播放音频流

本课对应源文件下载链接&#xff1a; https://download.csdn.net/download/XiBuQiuChong/88680079 FFmpeg作为一套庞大的音视频处理开源工具&#xff0c;其源码有太多值得研究的地方。但对于大多数初学者而言&#xff0c;如何快速利用相关的API写出自己想要的东西才是迫切需要…...

Spark编程实验四:Spark Streaming编程

目录 一、目的与要求 二、实验内容 三、实验步骤 1、利用Spark Streaming对三种类型的基本数据源的数据进行处理 2、利用Spark Streaming对Kafka高级数据源的数据进行处理 3、完成DStream的两种有状态转换操作 4、把DStream的数据输出保存到文本文件或MySQL数据库中 四…...

Flink去重计数统计用户数

1.数据 订单表&#xff0c;分别是店铺id、用户id和支付金额 "店铺id,用户id,支付金额", "shop-1,user-1,1", "shop-1,user-2,1", "shop-1,user-2,1", "shop-1,user-3,1", "shop-1,user-3,1", "shop-1,user…...

力扣:62. 不同路径(动态规划,附python二维数组的定义)

题目&#xff1a; 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish” &#xff09;。 问总共有多少条不同的路径&…...

2022年全球运维大会(GOPS深圳站)-核心PPT资料下载

一、峰会简介 GOPS 主要面向运维行业的中高端技术人员&#xff0c;包括运维、开发、测试、架构师等群体。目的在于帮助IT技术从业者系统学习了解相关知识体系&#xff0c;让创新技术推动社会进步。您将会看到国内外知名企业的相关技术案例&#xff0c;也能与国内顶尖的技术专家…...

8868体育助力意甲罗马俱乐部 迪巴拉有望付出

8868体育助力意甲罗马俱乐部 迪巴拉有望付出 意甲罗马俱乐部是8868体育合作球队之一&#xff0c;本赛季&#xff0c;在意甲第14轮的比赛中&#xff0c;罗马客场2-1战胜萨索洛&#xff0c;积分上升到意甲第4位。 有报道称&#xff0c;迪巴拉在对阵佛罗伦萨的比赛中受伤&#xff…...

java设计模式实战【策略模式+观察者模式+命令模式+组合模式,混合模式在支付系统中的应用】

引言 在代码开发的世界里&#xff0c;理论知识的重要性毋庸置疑&#xff0c;但实战经验往往才是知识的真正试金石。正所谓&#xff0c;“读万卷书不如行万里路”&#xff0c;理论的学习需要通过实践来验证和深化。设计模式作为软件开发中的重要理论&#xff0c;其真正的价值在…...

小程序wx:if 和hidden的区别?

在小程序中&#xff0c;wx:if 和 hidden 是用于条件渲染的两种不同方式。 选择使用哪种方式取决于具体情况。如果条件变化频繁或节点包含复杂的子节点&#xff0c;可以考虑使用 wx:if 进行条件渲染&#xff1b;如果条件变化较少且节点结构简单&#xff0c;可以使用 hidden 控制…...

自动驾驶学习笔记(二十三)——车辆控制模型

#Apollo开发者# 学习课程的传送门如下&#xff0c;当您也准备学习自动驾驶时&#xff0c;可以和我一同前往&#xff1a; 《自动驾驶新人之旅》免费课程—> 传送门 《Apollo开放平台9.0专项技术公开课》免费报名—>传送门 文章目录 前言 运动学模型 动力学模型 总结…...

Linux Shell 015-文本双向覆盖重定向工具tee

Linux Shell 015-文本双向覆盖重定向工具tee 本节关键字&#xff1a;Linux、Bash Shell、文本双向覆盖重定向工具 相关指令&#xff1a;tee、echo、cat tee介绍 tee工具是从标准输入读取并写入到标准输出和文件&#xff0c;即&#xff1a;双向覆盖重定向&#xff08;屏幕输出…...

【PyQt】(自定义类)QIcon派生,更易用的纯色Icon

嫌Qt自带的icon太丑&#xff0c;自己写了一个&#xff0c;主要用于纯色图标的自由改色。 当然&#xff0c;图标素材得网上找。 Qt原生图标与现代图标对比&#xff1a; 没有对比就没有伤害 Qt图标 网络素材图标 自定义类XJQ_Icon&#xff1a; from PyQt5.QtGui import QIc…...

【mysql】数据处理格式化、转换、判断

数据处理 判断是否超时&#xff0c;时间是否大于当前时间计算分钟数时间格式化处理如果数值类型进行转换字符类型字符拼接case-when代替if-else判断数据空&#xff08;特殊&#xff1a;含空数据、空字符处理&#xff09; select /*判断是否超时&#xff0c;时间是否大于当前…...

深入探索Java中的UDP网络通信机制

在网络通信中&#xff0c;UDP&#xff08;User Datagram Protocol&#xff0c;用户数据报协议&#xff09;是一种无连接的协议&#xff0c;它在某些情况下比TCP更适合&#xff0c;尤其是在要求速度快、对数据准确性要求相对较低的场景下。本文将介绍如何使用Java进行UDP网络通信…...

List常见方法和遍历操作

List集合的特点 有序&#xff1a; 存和取的元素顺序一致有索引&#xff1a;可以通过索引操作元素可重复&#xff1a;存储的元素可以重复 List集合的特有方法 Collection的方法List都继承了List集合因为有索引&#xff0c;所以有了很多操作索引的方法 ublic static void main…...

【基础篇】一、认识JVM

文章目录 1、虚拟机2、Java虚拟机3、JVM的整体结构4、Java代码的执行流程5、JVM的三大功能6、JVM的分类7、JVM的生命周期 1、虚拟机 虚拟机&#xff0c;Virtual Machine&#xff0c;一台虚拟的计算机&#xff0c;用来执行虚拟计算机指令。分为&#xff1a; 系统虚拟机&#x…...

DrGraph原理示教 - OpenCV 4 功能 - 颜色空间

前言 前段时间&#xff0c;甲方提出明确需求&#xff0c;让把软件国产化。稍微研究了一下&#xff0c;那就转QT开发&#xff0c;顺便把以前的功能代码重写一遍。 至于在Ubuntu下折腾QT、OpenCV安装事宜&#xff0c;网上文章很多&#xff0c;照猫画虎即可。 这个过程&#xff0…...

听GPT 讲Rust源代码--src/tools(36)

File: rust/src/tools/clippy/clippy_lints/src/loops/empty_loop.rs 在Rust源代码中&#xff0c;empty_loop.rs文件位于src/tools/clippy/clippy_lints/src/loops/目录下&#xff0c;它的作用是实现并提供一个名为EMPTY_LOOP的Lint规则。Clippy是一个Rust的静态分析工具&#…...

学生数据可视化与分析工具 vue3+flask实现

目录 一、技术栈亮点 二、功能特点 三、应用场景 四、结语 学生数据可视化与分析工具介绍 在当今的教育领域&#xff0c;数据驱动的决策正变得越来越重要。为了满足学校、教师和学生对于数据深度洞察的需求&#xff0c;我们推出了一款基于Vue3和Flask编写的学生数据可视化…...

uni-app condition启动模式配置

锋哥原创的uni-app视频教程&#xff1a; 2023版uniapp从入门到上天视频教程(Java后端无废话版)&#xff0c;火爆更新中..._哔哩哔哩_bilibili2023版uniapp从入门到上天视频教程(Java后端无废话版)&#xff0c;火爆更新中...共计23条视频&#xff0c;包括&#xff1a;第1讲 uni…...

网大为卸任腾讯CXO;Midjourney 1 月训练视频模型;2023年马斯克赚了7700亿

投融资 • 2023 年大型科技公司在生成式 AI 初创企业上的投资远超风险投资集团• 恒信东方与无锡政府合作成立布局 MR/XR 技术及 3D 数字资产 AIGC 产业投资基金• 新公司法完善注册资本认缴登记制度• 网大为卸任腾讯CXO&#xff0c;曾促成南非MIH的投资• 宁波蔚孚科技完成数…...

据报道,微软的下一代 Surface 笔记本电脑将是其首款真正的“人工智能 PC”

明年&#xff0c;微软计划推出 Surface Laptop 6和 Surface Pro 10&#xff0c;这两款设备将提供 Arm 和 Intel 两种处理器选项。不愿意透露姓名的不透露姓名人士透露&#xff0c;这些新设备将引入先进的人工智能功能&#xff0c;包括配备下一代神经处理单元 (NPU)。据悉&#…...

Springer build pdf乱码

在textstudio中编辑时没有错误&#xff0c;在editor manager生成pdf时报错。 首先不要改源文件&#xff0c;着重看你的上传顺序&#xff1a; 将.tex文件&#xff0c;.bst文件&#xff0c;.cls文件&#xff0c;.bib文件, .bbl文件的类型&#xff0c;在editor manager中是Item。…...

k8s之kudeadm

kubeadm来快速的搭建一个k8s的集群&#xff1a; 二进制搭建适合大集群&#xff0c;50台以上主机 kubeadm更适合中小企业的业务集群 master&#xff1a;192.168.233.91 docker kubelet lubeadm kubectl flannel node1:192.168.233.92 docker kubelet lubeadm kubectl flannel…...

NModbus-一个C#的Modbus协议库实现

NModbus-一个基于C#实现的Modbus通信协议库 最近在学习C#的时候&#xff0c;因为之前做过环保设备时使用C做过环保设备采集使用到了Modbus协议&#xff0c;当时看了一下基于C语言开发的libmodbus库。所以特意搜索看了一下C#下有什么Modbus协议库&#xff0c;在Github上面找了一…...

Altium Designer20中遇到的问题和解决办法记录

最近二战考完研了&#xff0c;重新拾起之前学的一些项目&#xff0c;最近在优化以前话的四层PCB版的时候发现了在使用AD使碰到一些问题现在记录如下&#xff1a; 1.Altium Designer 中的 Clearance Constraint 错误如何修改 &#xff1a; 我遇到的报错如下&#xff1a;  这…...

flask web学习之flask与http(二)

文章目录 1. HTTP响应1.1 响应报文1.2 常见HTTP状态码1.3 在flask中如何生成响应1.3.1重定向1.3.2错误响应 1.4响应格式 在flask程序中&#xff0c;客户端发出的请求触发相应的视图函数&#xff0c;获取返回值会作为响应的主体&#xff0c;最后生成完整的响应&#xff0c;即响应…...

基于Python的电商手机数据可视化分析和推荐系统

1. 项目简介 本项目旨在通过Python技术栈对京东平台上的手机数据进行抓取、分析并构建一个简单的手机推荐系统。主要功能包括&#xff1a; 网络爬虫&#xff1a;从京东获取手机数据&#xff1b;数据分析&#xff1a;统计各厂商手机销售分布、市场占有率、价格区间和好评率&am…...

汽车制造厂批量使用成华制造弹簧平衡器

数年来&#xff0c;成华制造都在不断的向各行各界输出着自己的起重设备&#xff0c;与众多企业达成合作&#xff0c;不断供应优质产品。近些年&#xff0c;成华制造以其卓越的产品质量和高效的生产能力&#xff0c;成功实现了弹簧平衡器的大规模批量供应&#xff0c;为重庆数家…...

一语道破爬虫,来揭开爬虫面纱

目录 一、爬虫&#xff08;网络蜘蛛(Spider)&#xff09; 1.1、是什么&#xff1a; 1.2、学习的原因 1.3、用在地方&#xff1a; 1.4、是否合法&#xff1a; 1.5、后果 案例&#xff1a; 二、应用领域 三、Robots协议 四、抓包 4.1、浏览器抓包 4.2、抓包工具 常见…...

时序分解 | Matlab实现贝叶斯变化点检测与时间序列分解

时序分解 | Matlab实现贝叶斯变化点检测与时间序列分解 目录 时序分解 | Matlab实现贝叶斯变化点检测与时间序列分解效果一览基本介绍程序设计参考资料 效果一览 基本介绍 Matlab实现贝叶斯变化点检测与时间序列分解 1.Matlab实现贝叶斯变化点检测与时间序列分解&#xff0c;完…...

Python 操作 MySQL:使用 mysql-connector-python 操作 MySQL 数据库

大家好&#xff0c;我是水滴~~ 当涉及到使用 Python 操作 MySQL 数据库时&#xff0c;mysql-connector-python 库是一个强大而常用的选择。该库提供了与 MySQL 数据库的交互功能&#xff0c;使您能够执行各种数据库操作&#xff0c;如连接数据库、执行查询和插入数据等。在本文…...