flex,promise里catch,作用域和作用域链和闭包,递归展开嵌套数组

embedded/2024/9/22 16:37:01/

目录

1. flex里shrink,grow和basis具体应用

2 promise里的catch

3 作用域和作用域链

4 递归展开嵌套数组


1. flex里shrink,grow和basis具体应用

<style>
.container {
display:flex;
width:600px;
}.div1 {
flex:1 2 500px;
}.div2 {
flex:2 1 400px;
}
</style><div class="container"><div class="div1"></div><div class="div2"></div>
</div>

500px+400px超出 600宽度300px

shrink发挥作用,按照2:1缩小比例

div1缩小 200px,div2缩小100px,最终 都是300px

例子 1:增加容器宽度 

css">.container {display: flex;width: 1000px;
}
.div1 {flex: 1 2 500px;
}
.div2 {flex: 1 1 400px;
}

剩余空间为100px,两者都拓宽50px,宽度分别为550px和450px

例子3:没有 flex-grow 或 flex-shrink 

css">.container {display: flex;width: 1000px;
}
.div1 {flex: 0 0 500px;
}
.div2 {flex: 0 0 400px;
}

这里 flex-grow 和 flex-shrink 都是 0,这意味着不管容器宽度如何,子元素宽度都固定为 500px 和 400px

例子4:div1 div2各自有宽度

css">.container {display: flex;width: 600px;
}
.div1 {width:400px;flex: 1 2 500px;}
.div2 {width:400px;flex: 2 1 400px;}

以400px+400px,发现超出200px

.div1 的缩小比例为 2/3,所以它缩小的部分为 200px * (2/3) = 133.33px

.div2 的缩小比例为 1/3,所以它缩小的部分为 200px * (1/3) = 66.67px

.div1 的最终宽度:400px - 133.33px = 266.67px

.div2 的最终宽度:400px - 66.67px = 333.33px

2 promise里的catch

  2.1 多级嵌套的 Promise 链

javascript">function fetchData1() {return new Promise((resolve, reject) => {setTimeout(() => {Math.random() > 0.5 ? resolve('Data 1') : reject('Error 1');}, 1000);});}function fetchData2() {return new Promise((resolve, reject) => {setTimeout(() => {Math.random() > 0.5 ? resolve('Data 2') : reject('Error 2');}, 1000);});}function fetchData3() {return new Promise((resolve, reject) => {setTimeout(() => {Math.random() > 0.5 ? resolve('Data 3') : reject('Error 3');}, 1000);});}fetchData1().then((data1) => {console.log(data1);return fetchData2();}).then((data2) => {console.log(data2);return fetchData3();}).then((data3) => {console.log(data3);}).catch((error) => {// console.error('Caught an error:', error);throw Error('apple')}).catch((err)=>{'pine',err})

在promise链中 如果promise出现错误被reject 错误会沿着链向下传播 直到遇到第一个catch为止,链条后续的then处理被跳过 直接进入catch

所以可能的输出是:

Data 1
 Data 2
 pine Error: apple

哪里出现 pine Error: apple 后续的就会终止

2.2多次重试机制的 Promise

javascript">function fetchDataWithRetry(retries = 3) {return new Promise((resolve, reject) => {function attempt() {setTimeout(() => {Math.random() > 0.5 ? resolve('Success') : retries-- > 0 ? attempt() : reject('Failed after retries');}, 1000);}attempt();});}fetchDataWithRetry().then((result) => {console.log(result);}).catch((error) => {console.error('Error:', error);});

2.3 多个并发的 Promise 任务与错误处理

javascript">function fetchData(id) {return new Promise((resolve, reject) => {setTimeout(() => {Math.random() > 0.5 ? resolve(`Data ${id}`) : reject(`Error from ${id}`);}, 1000);});}Promise.allSettled([fetchData(1), fetchData(2), fetchData(3)]).then((results) => {results.forEach((result) => {if (result.status === 'fulfilled') {console.log('Fulfilled:', result.value);} else {console.error('Rejected:', result.reason);}});});

2.4 结合 async/await 与 try/catch 捕获

javascript">function fetchData1() {return new Promise((resolve, reject) => {setTimeout(() => {Math.random() > 0.3 ? resolve(`Data 1`) : reject(`Error from 1`);}, 1000);});}function fetchData2() {return new Promise((resolve, reject) => {setTimeout(() => {Math.random() > 0.4 ? resolve(`Data 2`) : reject(`Error from 2`);}, 1000);});}function fetchData3() {return new Promise((resolve, reject) => {setTimeout(() => {Math.random() > 0.6 ? resolve(`Data 3`) : reject(`Error from 3`);}, 1000);});}async function fetchData() {try {const data1 = await fetchData1();console.log(data1);} catch (error) {console.error('Caught an error during fetch:', error);}try{const data2 = await fetchData2();console.log(data2);} catch (error) {console.error('Caught an error during fetch:', error);}try{const data3 = await fetchData3();console.log(data3);} catch (error) {console.error('Caught an error during fetch:', error);}} fetchData()

一个函数里可以有多个try-catch模块

3 作用域和作用域链

作用域: 函数和变量可见范围

作用域链:当前作用域找不到变量 到上一层找 直到全局也找不到  层层关系

shadowing:局部和外部同名 局部会遮蔽外部

局部变量可以访问外部和全局(任何地方都能访问对象)

利用闭包保存状态

执行上下文:全局,函数

执行栈:先全局执行上下文压入栈里,每次函数调用就新的执行上下文压入栈里,然后执行栈顶 弹出执行上下文

生命周期: 创建:确定this,词法和变量环境;执行:变量赋值 代码执行;回收:弹出执行上下文

js执行有解释和执行阶段,作用域是解释阶段确定的,执行上下文是执行阶段确定的

闭包形成是函数定义 作用域链和执行上下文共同作用 

javascript">function outer() {const value = 'outer value'; // 外部变量function inner() {const value = 'inner value'; // 内部变量,遮蔽外部变量console.log(value); // 输出 'inner value'}console.log(value); // 输出 'outer value'return inner;}let x = outer();x()

inner函数形成闭包 即使outer已执行完毕还是能访问value,然后保留对value的引用

fn.length 是一个属性,返回函数 fn 的参数个数

javascript">function curry(fn) {return function curried(...args) {if (args.length >= fn.length) {return fn(...args);}return function(...args2) {return curried(...args, ...args2);};};
}function multiply(a, b) {return a * b;
}const curriedMultiply = curry(multiply);
console.log(curriedMultiply(2)(3)); 

4 递归展开嵌套数组

javascript">//'abc'->value:'abc'//'[abc[def]]'->{value:'abc',children:{value:'def',children:null}}function digui(str,index){let node={value:'',children:null}while(index.value<str.length){let char=str[index.value++]if(char==='['){node.children=digui(str,index);}else if(char===']')break;else node.value+=char}return node}function yuan(str){let index={value:0}if(str[index.value]==='['){index.value++return digui(str,index)}else return digui(str, index)}let str1='abc'let str2='[abc[def]]'console.log(yuan(str1))console.log(yuan(str2))


http://www.ppmy.cn/embedded/115128.html

相关文章

PHP项目中Vendor错误导致项目失败的解决方案

在PHP项目中&#xff0c;vendor目录通常用于存放通过Composer安装的依赖库。虽然这些依赖极大地提高了开发效率&#xff0c;但它们也可能成为项目失败的隐患。本文将探讨常见的Vendor错误及其解决方案。 #### 1. 常见的Vendor错误 ##### 1.1 版本不兼容 不同的依赖可能对PHP…

计算机毕业设计hadoop+spark+hive物流预测系统 物流大数据分析平台 物流信息爬虫 物流大数据 机器学习 深度学习

流程&#xff1a;1.Python爬虫采集物流数据等存入mysql和.csv文件&#xff1b;2.使用pandasnumpy或者MapReduce对上面的数据集进行数据清洗生成最终上传到hdfs&#xff1b;3.使用hive数据仓库完成建库建表导入.csv数据集&#xff1b;4.使用hive之hive_sql进行离线计算&#xff…

前端分段式渲染较长文章

实现思路&#xff1a; 1. 后端返回整篇文章。 2. JavaScript 分段处理&#xff1a;将文章按一定的字符或段落长度分割&#xff0c;然后逐步将这些段落追加到页面上。 3. 定时器或递归调用&#xff1a;使用 setInterval 或 setTimeout 来控制段落的逐步渲染。 代码实现示例 …

Hive parquet表通过csv文件导入数据

1. background 已建好了 hive parquet 格式的表, 需要从服务器的csv导入数据至该hive表 2. step 提前上传csv至服务器 /path/temp.csv 创建 textfile 格式的中转表(这里使用内部表,方便删除) ,源表名dw_procurement.dwd_tc_comm_plant ,这里中转表加上了csv后缀 CREATE TA…

计算机基础(Computer Fundamentals)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…

【设计模式-外观】

这里写自定义目录标题 定义UML图角色作用代码使用场景 定义 为子系统中一组相关接口提供一致界面&#xff0c;定义一个高级接口&#xff0c;使得子系统更加容易使用。 UML图 角色作用 外观&#xff08;Facade&#xff09;角色&#xff1a;这是外观模式的核心&#xff0c;它知…

openEuler系统安装内网穿透工具实现其他设备公网环境远程ssh连接

目录 前言 1. 本地SSH连接测试 2. openEuler安装Cpolar 3. 配置 SSH公网地址 4. 公网远程SSH连接 5. 固定连接SSH公网地址 6. SSH固定地址连接测试 作者简介&#xff1a; 懒大王敲代码&#xff0c;计算机专业应届生 今天给大家聊聊openEuler系统安装内网穿透工具实现其他…

某建筑市场爬虫数据采集逆向分析

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言 目标网站 aHR0cHM6Ly9qenNjLm1vaHVyZC5nb3YuY24vZGF0YS9jb21wYW55P2NvbXBsZXhuYW1lPSVFNiVCMCVCNA 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面…