设计师网站pin专业教育网站建设

news/2025/9/23 9:38:25/文章来源:
设计师网站pin,专业教育网站建设,怎么看自己的网站是用什么做的,互联网创新创业项目计划书案例使用 async/await 是必须避免的陷阱 如果我们使用过 nodejs#xff0c;那么我们可能已经在 javaSoript 中使用了异步操作。异步任务是一个独立于 JavaSoript 引擎的主线程执行的操作。从本质上讲#xff0c;这就是应用程序功能没有阻塞的 UI 的原因。 nodejs 的单线程性质那么我们可能已经在 javaSoript 中使用了异步操作。异步任务是一个独立于 JavaSoript 引擎的主线程执行的操作。从本质上讲这就是应用程序功能没有阻塞的 UI 的原因。 nodejs 的单线程性质这一点极其重要。 Node.js 利用事件循环来处理所有异步操作保留了用于计算函数的主线程。 假设我们对事件循环有相当的了解。在这种情况下我们会明白当在调用堆栈中发现一个非同步操作时JS会把它放到线程池上线程池将通过 libuv 库异步地执行它。之后 libuv 将执行操作并将其推进到事件队列中。事件队列将被持续监控事件队列中的事件将被提取并在处理异步操作响应的回调函数上执行。这基本上就是 nodejs 如何处理异步操作。 例如我们可以使用 JavaSrispt 中 Promise 建立异步操作。Promise 返回的一个对象代表其进程。 // 返回一个Promise对象 function fetchData() {return new Promise((resolve, reject) {// 使用setTimeout 模拟一个异步操作setTimeout(() {const data Sample Data;const success true; if (success) {resolve(data); } else {reject(Error: Unable to fetch data);}}, 2000);}); } const fetchDataPromise fetchData(); fetchDataPromise.then(data {console.log(Data received:, data); }) .catch(error {console.error(error); });fetchData 方法返回的 Promise 对象包含两种方法then 和 catch。开发者可以在这两个方法中获取结果。 这使 JavaSrhpt 更加强大使我们能够构建实时聊天应用程序和API等应用程序。然而在设计应用程序时使用JavaSrispt异步操作会有一些常见的缺陷,我们必须考虑这些缺陷以便能够实现缓解这些问题的方法。 注意:这些陷阱存在于任何 javascript 框架。 回调地狱 使用基于 Promise 的异步操作的关键问题之一是回调地狱。在这种情况下回调会不断调用 Promise导致回调链。例如 function performAsyncOperation(delay: number, message: string): Promisestring {return new Promise((resolve) {setTimeout(() {console.log(message);resolve(message);}, delay);}); }export async function callbacks() {const delay 1000;const message Hello World;return performAsyncOperation(delay, message).then((value) {performAsyncOperation(delay, value).then((secondValue) {performAsyncOperation(delay, secondValue).then((thirdValue) {performAsyncOperation(delay, thirdValue).then(() {console.log(End The Callback);}).catch(() {console.log(Error);});;}).catch(() {console.log(Error);});;}).catch(() {console.log(Error);});}); }callbacks() 方法 返回一个 performAsyncOperation 并继续添加更多的异步操作。虽然能在生产中发挥完美的作用。但是当我们考虑到可维护性时它将是一个混乱的问题。例如很难看到什么样的回调应用在什么级别。 所以我们如何避免这种情况? 为了修复回调地狱问题我们可以将此转换为 async/await 。所以, 我们看看这个的更新代码 : function performAsyncOperation(delay: number, message: string): Promisestring {return new Promise((resolve) {setTimeout(() {console.log(message);resolve(message);}, delay);}); }export async function asyncAwait() {try {const delay 1000;let message Hello World;message await performAsyncOperation(delay, message);message await performAsyncOperation(delay, message);message await performAsyncOperation(delay, message);await performAsyncOperation(delay, message);console.log(End The Callback);} catch (error) {console.log(Error:, error);} }我们已经成功地将回调地狱重构为更清洁的方法它使用async/await这允许我们执行相同的异步代码而我们在早些时候执行了一个更干净的方法。await 意味着每一行代码在收到回复之前等候。如果它返回一个成功的响应它将继续到下一个。但是如果它遇到错误它将跳到公共的catch 整块。这样做可以避免维护多个错误处理程序和使用单个错误处理程序的需要。 同步函数链 我们已经重构我们的代码使用async/await 块来处理多个异步调用。但是现在我们可能会注意到这里有一个新问题 function performAsyncOperation(delay: number, message: string): Promisestring {return new Promise((resolve) {setTimeout(() {console.log(message);resolve(message);}, delay);}); }export async function issueAsyncAwait() {try {const delay 1000;let message Hello World;await performAsyncOperation(delay, message);console.log(Phase 01);await performAsyncOperation(delay, message);console.log(End The Callback);} catch (error) {console.log(Error:, error);} }在这种情况下,我们想执行 console.log(‘Phase 1’) 但是performAsyncOperation 方法在一个单独的进程中执行我们的打印应该是在performAsyncOperation 方法执行前完成对吗? 经过检查我们可以看到这并不是我们所期待的。怎么回事? 顾名思义它等待整个代码块直到异步操作返回响应。因此这使得我们的代码同步并创建了一个瀑布调用模式,在这里我们的代码将一个接一个地调用。 因此如果我们的事件并不相互依赖如果我们的事件不依赖于非同步操作的输出我们不必一定要等到非同步操作完成对吗? 所以在这种情况下, 考虑使用回调 : function performAsyncOperation(delay: number, message: string): Promisestring {return new Promise((resolve) {setTimeout(() {console.log(message);resolve(message);}, delay);}); }export async function asyncAwaitFix() {try {const delay 1000;let message Hello World;performAsyncOperation(delay, message).then((resp) console.log(Process the resp: ${resp}.));console.log(Phase 01);await performAsyncOperation(delay, message);console.log(End The Callback);} catch (error) {console.log(Error:, error);} }如你所见我们重构了performAsyncOperation 方法并使用 .then() 回调。这样做可以让回调作为一个真正的回调执行并且不会在代码中创建任何等待。为了验证我们的理论,让我们检查一下输出: 如你所见Phase 01 首先打印了不再等待到 async 操作完成。 但是要小心使用这个因为我们可能会创建回调地狱! 循环的性能问题 接下来,让我们谈谈循环。我们都用 JavaScript 写过循环 for (let i 0; i 5; i) {console.log(Iteration number:, i);}我们循环了一组元素并对其进行了一些计算。但是如果我们必须在这里执行异步操作呢假设我们得到了一堆用户身份证。并被要求获取所有身份证的信息(注意我们的API不支持批量)。 我们可能会这样写 function getUserInfo(id: number) {return new Promise((resolve) {// 模拟异步setTimeout(() {resolve({ userId: id, name: User_${id}, email: user${id}example.com });}, 1000);}); }export async function asyncForLoopIssue(userIds: number[] [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) {const usersInfo: any[] [];for (let i 0; i userIds.length; i) {const userInfo await getUserInfo(userIds[i]);usersInfo.push(userInfo);}console.log({ usersInfo });return usersInfo; }现在这个代码再次没有问题。它将按预期在生产中发挥作用。但是我们被限制在这里的同步循环。这意味着一旦收集到单个用户信息我们的循环的下一次迭代将开始。因此这个函数将在10s后执行并像这样的同步输出 这是一个接一个发生的。 但我们该怎么解决? 可以用非线性来执行这个循环 function getUserInfo(id: number) {return new Promise((resolve) {setTimeout(() {resolve({ userId: id, name: User_${id}, email: user${id}example.com });}, 1000);}); }export async function loopAsyncFix(userIds: number[] [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) {const promises userIds.map(async (id) {const userInfo await getUserInfo(id);return userInfo;})const usersInfo await Promise.all(promises);console.log({ usersInfo });return usersInfo; }现在这种方法将产生相同的响应。然而它的实现方式有点不同。 在方法01中每次迭代都在当前的async操作完成后开始。 async 意味着它应该在不干扰主线程的情况下执行。 第二种方法坚持真正的异步方法因为它返回最终将执行的 Promise 对象。因此虽然我们是顺序运行它但是它将返回随机调用每个调用都是独立的并且在没有相关顺序的情况下按自己的速度执行。

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

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

相关文章

关于建设学校网站策划书的范本江苏外协机械加工网

反编译小程序出现异常: SyntaxError: Unexpected token ‘}’ 网上很多都说使用最新版本的反编译 wxappUnpacker-master 包可以进行解析,但是大神已经停止了更新wxappUnpacker-master 包; 查找了网上大部分的wxappUnpacker-master 包&#…

Neo4j常用的语句记录

1. 核心概念:节点、关系、属性 在开始学习语句之前,先理解三个核心概念:节点:表示实体(如人、电影、产品)。用圆括号表示:()。(p:Person):一个带有标签 Person 的节点,变量名为 p。关系:表示节点之间的连接。…

wordpress数据库导入放心网站推广优化咨询

时序分解 | MATLAB实现CEEMDANSE自适应经验模态分解样本熵计算 目录 时序分解 | MATLAB实现CEEMDANSE自适应经验模态分解样本熵计算效果一览基本介绍程序设计参考资料 效果一览 基本介绍 MATLAB实现CEEMDANSE自适应经验模态分解样本熵计算 包括频谱图 附赠案例数据 可直接运行 …

Model Context Protocol (MCP) 完整协议流程详解

1. 概述 Model Context Protocol (MCP) 是一种标准化协议,允许应用程序向AI助手提供上下文信息,包括工具、资源和提示等。该协议基于JSON-RPC 2.0规范,支持双向通信。 2. MCP连接建立流程 2.1 初始连接 sequenceDia…

Java中 String、StringBuilder 和 StringBuffer 的区别? - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

常用的 HTTP 请求方法和区别

常用的 HTTP 请求方法最核心和常用的方法有以下几个:GET用途:请求指定的资源。只用于获取数据,不应产生任何“副作用”(如修改数据)。特点:请求的参数直接附加在 URL 后面(查询字符串 Query String),有长度限…

什么叫网站优化怎么用vs做网站开发

背景 美团点评作为全球最大的生活服务平台,承接超过千万的POI,服务于数量庞大的活跃用户。在海量数据的前提下,定位运营业务、准确找到需要数据的位置,并快速提供正确、一致、易读的数据就变得异常困难,这些困难主要体…

网站左侧导航栏设计交换链接是什么意思

目录 什么是渗透测试 渗透测试的重要性 渗透测试的前置技能 开始入门学习路线 什么是渗透测试 渗透测试,通常被视为模拟黑客的一种安全评估行为,其目的在于全面挖掘目标网站或主机的潜在安全漏洞。与真实的黑客攻击不同,渗透测试旨在发现…

个人建网站做站长手机做免费个人网站

目录 前言1. mysql.connector2. pymysql 前言 连接Mysql一般有几种方法,主要讲解mysql.connector以及pymysql的连接 后续如果用到其他库还会持续总结! 对于数据库中的表格,本人设计如下:(为了配合下面的操作) 1. mysql.connector mysql.connector 是一…

网站cms模板那些网站可以做行测题

随着城市建设的不断发展和交通运输的快速增长,渣土车作为建筑行业中不可或缺的运输工具,承担着大量的渣土运输任务。然而,由于渣土车在运输过程中存在超速、违规变道、碾压行人等交通安全问题,给道路交通和行人安全带来了严重的隐…

网站容易出现的问题什么叫网站前台

一、session 1、客户端发送请求,服务器将登录信息存储在 Session 中,Session 依赖于 Cookie(cookie指的就是在浏览器里面存储的一种数据,仅仅是浏览器实现的一种数据存储功能。Cookie实际上是一小段的文本信息。)&…

高平网站建设沉默是金什么意思

目录 引言 1 FastSAM介绍 1.1 FastSAM诞生 1.2 模型算法 1.3 实验结果 2 FastSAM运行环境构建 2.1 conda环境构建 2.2 运行环境安装 2.3 模型下载 3 FastSAM运行 3.1 命令行运行 3.1.1 Everything mode 3.1.2 Text prompt 3.1.3 Box prompt (xywh) 3.1.4 Points p…

网站运营推广主要做什么的泰安房产网站

目的 Redis和Msql来保持数据同步,并且强一致,以此来提高对应接口的响应速度,刚开始考虑是用mybatis的二级缓存,发现坑不少,于是决定自己搞 要关注的问题点 操作数据必须是唯一索引 如果更新数据不是唯一索引&#…

jquery网站开发查找网站域名

概要介绍 时间序列数据是一种表示物理设备,系统、应用过程或行为随时间变化的数据,广泛应用于物联网,工业物联网,基础运维系统等场景。阿里云TSDB 时间序列数据库可以解决大规模时序数据的可靠写入,降低数据存储成本&…

建设监理继续教育网站响应式网站手机端

近日,浙江智臾科技有限公司(以下简称“智臾科技”)正式签署 CLA 贡献者许可协议,加入龙蜥社区(OpenAnolis)。 智臾科技主创团队从 2012 年开始投入研发 DolphinDB。DolphinDB 作为一款基于高性能时序数据库…

网站如何改版厦门手机网站建设

一. 六大日志 慢查询日志:记录所有执行时间超过long_query_time的查询,方便定位并优化。 # 查询当前慢查询日志状态 SHOW VARIABLES LIKE slow_query_log; #启用慢查询日志 SET GLOBAL slow_query_log ON; #设置慢查询文件位置 SET GLOBAL slow_query_log_file …

建设网站包维护粤嵌培训4个月收费

好 接下来 我们讲一个对开发非常重要的东西 热部署 因为 我们在开发过程中总会希望快点看到效果 或者 你的企业项目一般很大很复杂,重启是一件非常麻烦的事 或者你在和前端同事联调,有一点小问题 你改完就要重启 前端还得等你,非常不友好 那…

网站图标素材图片深圳响应式设计企业网站

这篇文章主要是为了记录一下操作,这个假期又要给这套RAC扩容磁盘。 我这套Solaris的小机我还不总操作这玩意,和LINUX有点小差别,整理记录一下,要不每次都是现翻。 存储端划LUN映射到主机 登录到3PAR存储控制台,创建…

免费试用平台网站源码济南做网站优化哪家好

在使用hbase时出错,错误如下图: 错误原因: 返回去检查启动的Hadoop与zookeeper,发现zookeeper的状态不对,重新启动了一下zookeeper,确保所有机器的zookeeper都启动起来了就可以了。