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

news2024/9/22 19:17:33

目录

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:增加容器宽度 

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

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

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

.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各自有宽度

.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 链

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

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 任务与错误处理

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 捕获

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执行有解释和执行阶段,作用域是解释阶段确定的,执行上下文是执行阶段确定的

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

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 的参数个数

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 递归展开嵌套数组

//'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.coloradmin.cn/o/2155719.html

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

相关文章

【动态库的加载】【进程地址空间(三)】

目录 1. 宏观看待动态库的加载2. 进程地址空间第二讲2.1 程序没有加载前的地址2.2 程序加载后的地址 3. 动态库的地址 再谈进程地址空间时&#xff0c;【Linux】动静态库 我们先讲一个关于动态库是如何加载的话题&#xff0c;再引入进程地址空间&#xff0c;再次谈论该话题。 …

在ComfyUI中,Cross-Attention优化方案应该选哪个?

&#x1f431;‍&#x1f409;背景 在comfyui中&#xff0c;如果你使用了秋叶的启动器&#xff0c;会在高级选项中看到这样一行选项&#xff1a;Cross-Attention优化方案&#xff0c;右边有个下拉框&#xff0c;可以选择的选项有4个&#xff0c;如下图&#xff1a; 那么&#…

设计模式之观察者模式例题

答案&#xff1a;D 知识点&#xff1a; 观察者模式意图是定义对象间的一种一对多的依赖关系&#xff0c;当一个对象的状态发生改变时&#xff0c;所有依赖于它的对象都得到通知并被自动更新 状态模式 意图&#xff1a;允许一个对象在其内部状态改变时改变它的行为

【verilog】4. gtkwave的调用

文章目录 前言实验步骤 前言 进行 数电 FPGA 实验 实验步骤 将 GTKwave 的 bin 文件夹路径添加到 “系统环境变量” 的 “Path” 中 启动 debugger wizard, 设置观测信号 编译选择 2进制 文件 点击 start programming connect debugger 选择触发方式 Run 自动打开 gtkwave&a…

[Meachines] [Medium] Querier XLSM宏+MSSQL NTLM哈希窃取(xp_dirtree)+GPP凭据泄露

信息收集 IP AddressOpening Ports10.10.10.125TCP:135, 139, 445, 1433, 5985, 47001, 49664, 49665, 49666, 49667, 49668, 49669, 49670, 49671 $ nmap -p- 10.10.10.125 --min-rate 1000 -sC -sV -Pn PORT STATE SERVICE VERSION 135/tcp open msrp…

【若依RuoYi-Vue | 项目实战】帝可得后台管理系统(二)

文章目录 一、人员管理1、需求说明2、生成基础代码&#xff08;1&#xff09;创建目录菜单&#xff08;2&#xff09;添加数据字典&#xff08;3&#xff09;配置代码生成信息&#xff08;4&#xff09;下载代码并导入项目 3、人员列表改造&#xff08;1&#xff09;基础页面&a…

机器学习算法那些事 | TPAMI 2024.9 | FeatAug-DETR:通过特征增强丰富DETRs的一对多匹配

本文来源公众号“机器学习算法那些事”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;TPAMI 2024.9 | FeatAug-DETR&#xff1a;通过特征增强丰富DETRs的一对多匹配 论文标题&#xff1a;FeatAug-DETR: Enriching One-to-Many Mat…

智能指针:作用 | 使用 | 原理 | 内存泄漏

&#x1f308;个人主页&#xff1a; 南桥几晴秋 &#x1f308;C专栏&#xff1a; 南桥谈C &#x1f308;C语言专栏&#xff1a; C语言学习系列 &#x1f308;Linux学习专栏&#xff1a; 南桥谈Linux &#x1f308;数据结构学习专栏&#xff1a; 数据结构杂谈 &#x1f308;数据…

golang学习笔记4-基本数据类型

注&#xff1a;本人已有C&#xff0c;C,Python基础&#xff0c;只写本人认为的重点。 go的数据类型如下 由于bool和c类似&#xff0c;和go的区别是&#xff0c;bool的值只能取true和false&#xff0c;不能取整数&#xff0c;而且有默认值false。 一、整数型 整数型存放整数&…

设计模式之策略模式例题

答案&#xff1a;A 知识点&#xff1a; 策略模式又叫模板方法模式 它的意图是定义一个操作中的算法骨架。而将一些步骤延迟到子类中&#xff0c;使得子类可以不改变一个算法的结构即可重新定义算法的某些特定步骤

3.5.2 __ipipe_init()之完成中断处理程序设置

点击查看系列文章 》 Interrupt Pipeline系列文章大纲-CSDN博客 原创不易&#xff0c;需要大家多多鼓励&#xff01;您的关注、点赞、收藏就是我的创作动力&#xff01; 3.5.2 __ipipe_init()之完成中断处理程序设置 __ipipe_init()最核心的就是__ipipe_enable_pipeline()&am…

分享两道算法题

分享两道算法题 王者荣耀分组 题目描述 部门准备举办一场王者荣耀表演赛&#xff0c;有 10 名游戏爱好者参与&#xff0c;分 5 为两队&#xff0c;每队 5 人。 每位参与者都有一个评分&#xff0c;代表着他的游戏水平。 为了表演赛尽可能精彩&#xff0c;我们需要把 10 名参赛…

十七,Spring Boot 整合 MyBatis 的详细步骤(两种方式)

十七&#xff0c;Spring Boot 整合 MyBatis 的详细步骤(两种方式) 文章目录 十七&#xff0c;Spring Boot 整合 MyBatis 的详细步骤(两种方式)1. Spring Boot 配置 MyBatis 的详细步骤2. 最后&#xff1a; MyBatis 的官方文档&#xff1a;https://mybatis.p2hp.com/ 关于 MyBa…

内网渗透-红日1

红日靶场1 渗透测试过程外网打点突破边界内网横向权限维持最后 渗透测试过程 本文章只说明渗透测试思路和技巧&#xff0c;对域靶场搭建不进行赘述 web-ip外网设置为 192.168.119.130&#xff0c;kali和外网ip同网段 外网打点 kali扫描目标ip nmap扫描目标网段   nmap -P…

【记录】大模型|Windows 下 Hugging Face 上的模型的通用极简调用方式之一

这篇文是参考了这篇&#xff0c;然后后来自己试着搭了一下&#xff0c;记录的全部过程&#xff1a;【翻译】Ollama&#xff5c;如何在 Ollama 中运行 Hugging Face 中的模型_ollama 导入 huggingface-CSDN 博客 另外还参考了这篇&#xff1a;无所不谈,百无禁忌,Win11 本地部署无…

【C++初阶】探索STL之——vector

【C初阶】探索STL之——vector 1.什么是vector2.vector的使用2.1 vector的定义2.2 vector iterator(迭代器)的使用2.3 vector空间问题2.4 vector的增删查改2.5 vector迭代器失效的问题2.5.1 vector常见迭代器失效的操作 3 动态二位数组 1.什么是vector vector其实就是一个可以…

iPhone16,超先进摄像头系统?丝滑的相机控制

iPhone 16将于9月20号正式开售&#xff0c;这篇文章我们来看下iPhone 16 在影像方面&#xff0c;有哪些升级和新feature。 芯片&#xff1a;采用第二代 3纳米芯片&#xff0c;A18。 摄像头配置&#xff1a; iPhone 16 前置&#xff1a;索尼 IMX714 &#xff0c;1200 万像素&am…

SQL 多表联查

目录 1. 内联接&#xff08;INNER JOIN&#xff09; 2. 左外联接&#xff08;LEFT JOIN&#xff09; 3. 右外联接&#xff08;RIGHT JOIN&#xff09; 4. 全外联接&#xff08;FULL JOIN&#xff09; 5. 交叉联接&#xff08;CROSS JOIN&#xff09; 6. 自联接&#xff0…

简单题101. 对称二叉树 (python)20240922

问题描述&#xff1a; python: # Definition for a binary tree node. # class TreeNode(object): # def __init__(self, val0, leftNone, rightNone): # self.val val # self.left left # self.right rightclass Solution(object):def isSymm…

网络通信——OSI七层模型和TCP/IP模型

OSI模型 一.OSI七层模型 OSI&#xff08;Open System Interconnect&#xff09;七层模型是一种将计算机网络通信协议划分为七个不同层次的标准化框架。每一层都负责不同的功能&#xff0c;从物理连接到应用程序的处理。这种模型有助于不同的系统之间进行通信时&#xff0c;更…