发动态
作者:21Pilots一次代码CR引发的困惑“你这块的代码,没有做异常捕获呀,要是抛出了异常,可能会影响后续的代码流程”。这是一段出自组内代码CR群的聊天记录。代码类似如下: const asyncErrorThrow = () => { return new Promise((resolve, reject) => { // 业务代码... // 假设这里抛出了错误 throw new Error('抛出错误'); // 业务代码... }) } const testFun = async () => { await asyncErrorThrow(); console.log("async 函数中的后续流程"); // 不会执行 } testFun(); 在 testFun 函数中,抛出错误后,await 函数中后续流程不会执行。仔细回想一下,在我的前端日常开发中,对于错误捕获,还基本停留在使用 Promise时用 catch 捕获一下 Promise 中抛出的错误或者 reject,或者最基本的,在使用 JSON.parse、JSON.stringfy等容易出错的方法中,使用 try..catch... 方法捕获一下可能出现的错误。后来,这个同学将代码改成了:const asyncErrorThrow = () => { return new Promise((resolve, reject) => { // 业务代码... throw new Error('抛出错误'); // 业务代码... }) } const testFun = async () => { try { await asyncErrorThrow(); console.log("async 函数中的后续流程"); // 不会执行 } catch (error) { console.log("若错误发生 async 函数中的后续流程"); // 会执行 } } testFun(); 而这次不同的是,这段修改后的代码中使用了 try...catch...来捕获 async...await... 函数中的错误,这着实让我有些困惑,让我来写的话,我可能会在 await 函数的后面增加一个 catch:await asyncErrorThrow().catch(error => {})。因为我之前已经对 try..catch 只能捕获发生在当前执行上下文的错误(或者简单理解成同步代码的错误)有了一定的认知,但是 async...await... 其实还是异步的代码,只不过用的是同步的写法,为啥用在这里就可以捕获到错误了呢?在查阅了相当多的资料之后,才清楚了其中的一些原理。<顺便吆喝一句内推,技术大厂捞人捞人,前后端测试,东莞深圳等地急招~感兴趣来>Promise 中的错误我们都知道,一个 Promise 必然处于以下几种状态之一:待定(pending):初始状态,既没有被兑现,也没有被拒绝。已兑现(fulfilled):意味着操作成功完成。已拒绝(rejected):意味着操作失败。当一个 Promise 被 reject 时,该 Promise 会变为 rejected 状态,控制权将移交至最近的 rejection 处理程序。最常见的 rejection 处理程序就是 catch handler或者 then 函数的第二个回调函数。而如果在 Promise 中抛出了一个错误。这个 Promise 会直接变成 rejected 状态,控制权移交至最近的 error 处理程序。 const function myExecutorFunc = () => { // 同步代码 throw new Error(); }; new Promise(myExecutorFunc); Promise 的构造函数需要传入的 Executor 函数参数,实际上是一段同步代码。在我们 new 一个新的 Promise 时,这个 Executor 就会立即被塞入到当前的执行上下文栈中进行执行。但是,在 Executor 中 throw 出的错误,并不会被外层的 try...catch 捕获到。 const myExecutorFunc = () => { // 同步代码 throw new Error(); }; try { new Promise(myExecutorFunc); } catch (error) { console.log('不会执行: ', error); } console.log('会执行的'); // 打印 其原因是因为,在 Executor 函数执行的过程中,实际上有一个隐藏的机制,当同步抛出错误时,相当于执行了 reject 回调,让该 Promise 进入 rejected 状态。而错误不会影响到外层的代码执行。 const myExecutorFunc = () => { throw new Error(); // 等同于 reject(new Error()); }; new Promise(myExecutorFunc); console.log('会执行的'); // 打印 同理 then 回调函数也是这样的,抛出的错误同样会变成 reject。在一个普通脚本执行中,我们知道抛出一个错误,如果没有被捕获掉,会影响到后续代码的执行,而在 Promise 中,这个错误不会影响到外部代码的执行。对于 Promise 没有被捕获的错误,我们可以通过特定的事件处理函数来观察到。new Promise(function() { throw new Error(""); }); // 没有用来处理 error 的 catch // Web 标准实现 window.addEventListener('unhandledrejection', function(event) { console.log(event); // 可以在这里采取其他措施,如日志记录或应用程序关闭 }); // Node 下的实现 process.on('unhandledRejection', (event) => { console.log(event); // 可以在这里采取其他措施,如日志记录或应用程序关闭 }); Promise 是这样实现的,我们可以想一想为什么要这样实现。我看到一个比较好的回答是这个:传送门。我也比较赞成他的说法,我觉得,Promise 的诞生是为了解决异步函数过多而形成的回调地狱,使用了微任务的底层机制来实现异步链式调用。理论上是可以将同步的错误向上冒泡抛出然后用 try...catch... 接住的,异步的一些错误用 catch handler 统一处理,但是这样做的话会使得 Promise 的错误捕获使用起来不够直观,如果同步的错误也进行 reject 的话,实际上我们处理错误的方式就可以统一成 Promise catch handler 了,这样其实更直观也更容易让开发者理解和编写代码。async await 的问题那么回到我们最开始的问题,在这个里面,为什么 try catch 能够捕获到错误? jconst asyncErrorThrow = () => { return new Promise((resolve, reject) => { // 业务代码... throw new Error('抛出错误'); // 业务代码... }) } const testFun = async () => { try { await asyncErrorThrow(); console.log("async 函数中的后续流程"); // 不会执行 } catch (error) { console.log("若错误发生 async 函数中的后续流程"); // 会执行 } } testFun(); 我思考了很久,最后还是从黄玄大佬的知乎回答中窥见的一部分原理。这...难道就是浏览器底层帮我们处理的事儿吗,不然也没法解释了。唯一能够解释的事就是,async await 原本就是为了让开发者使用同步的写法编写异步代码,目的是消除过多的 Promise 调用链,我们在使用 async await 时,最好就是不使用 .catch 来捕获错误了,而直接能使用同步的 try...catch... 语法来捕获错误。即使 .catch 也能做同样的事情。只是说,代码编写风格统一性的问题让我们原本能之间用同步语法捕获的错误,就不需要使用 .catch 链式调用了,否则代码风格看起来会有点“异类”。这就是为什么 async MDN 中会有这样一句解释:参考文档:《使用Promise进行错误治理》- zh.javascript.info/promise-err…《为什么try catch能捕捉 await 后 promise 错误? 和执行栈有关系吗?》www.zhihu.com/question/52…
前端:为什么 try catch 能捕捉 await 后 Promise 的错误?
在大型电子设备的散热领域,我们已见证了众多成熟方案的光辉岁月,这里就不一一赘述了。但随着微电子技术的日新月异,芯片正朝着更小尺寸、更快运算速度的方向迈进,而伴随而来的,是日益严峻的散热挑战。比如,英特尔3.6G奔腾4终极版处理器,其峰值运行时产生的热量竟可达115W!这无疑对芯片的散热设计提出了更为苛刻的要求。�� 芯片散热新挑战面对这样的高热挑战,设计人员必须祭出先进的散热工艺与性能卓越的散热材料,以确保芯片能在其耐热极限内稳定工作。与此同时,随着电子设备及终端产品日益追求轻薄化,从CRT电视到液晶平板,从台式电脑到笔记本,再到数字机顶盒、便携式CD等,它们的散热设计已无法沿用传统模式,因为产品的轻薄化对散热设计提出了全新的要求。�� 温度与可靠性的紧密关联统计数据揭示了一个令人警醒的事实:电子元器件的温度每升高2度,其可靠性就会下降10%;当温升达到50度时,其寿命仅为温升25度时的1/6。由此可见,温度是影响设备可靠性的关键因素。因此,我们必须从技术层面入手,限制机箱及元器件的温升,这也就是我们常说的“热设计”。�� 热设计的两大原则热设计的核心原则有二:一是减少发热量,通过选用更优的控制方式和技术(如移相控制技术、同步整流技术等),以及低功耗器件,减少发热器件数量,加大粗印制线宽度,提高电源效率等手段来实现;二是加强散热,利用传导、辐射、对流等技术将热量有效转移。�� 扁平产品的散热难题然而,对于扁平化的电子产品而言,散热设计尤为棘手。由于空间限制,无法使用更多的散热铝片和风扇,也无法采用加强冷式散热设计或对流散热方式。因此,大家纷纷将目光投向了机壳散热。机壳散热的好处显而易见:无需额外添加风扇电源,避免了因风扇带来的灰尘和噪音问题。�� 软性硅胶导热绝缘材料的妙用那么,如何才能充分利用机壳进行散热呢?这时,软性硅胶导热绝缘材料便应运而生。作为传热界面材料的一种,软性导热硅胶绝缘垫可根据发热功率器件的大小及形状进行任意裁切,其导热能力和绝缘特性均表现出色。它能够有效填充发热功率器件与散热器之间的间隙,是替代导热硅脂+云母片二元散热系统的最佳选择。�� 材料性能详解傲琪电子的这款软性导热硅胶绝缘垫的导热系数高达13W/mK(而空气的导热系数仅为0.03w/mk),抗电压击穿值在4000伏以上,满足大部分电子设备的绝缘要求。其工艺厚度从0.5mm至5mm不等(特殊要求可增至10mm),方便设计者根据PCB板及发热功率器件的位置进行选择。此外,该材料还具备阻燃防火性能(符合U.L 94V-0要求),并通过了欧盟SGS环保认证。其工作温度范围在-50℃至220℃之间,因此是极佳的导热材料。�� 特别柔软,适用广泛值得一提的是,这款材料特别柔软,专为利用缝隙传递热量的设计方案而生。它能够填充缝隙,完成发热部位与散热部位的热传递,增加导热面积。同时,它还具有减震、绝缘、密封等多重功效,完全能够满足设备小型化、超薄化的设计要求。其厚度适用范围广,特别适用于汽车、显示器、计算机和电源等电子设备行业。如果您对这款软性硅胶导热绝缘材料感兴趣,或者想进一步了解我们的产品,请随时联系我们。张先生,18656456291。我们非常欢迎贵公司索取样品进行检测,我们将免费提供样品给您试用。期待与您的合作!
电子产品散热设计深度探讨
作者:BLACK595前言首先我们来看看如果要存储40亿QQ号需要多少内存?我们使用无符号整数存储,一个整数需要4个字节,那么40亿需要4*4000000000/1024/1024/1024≈15G,在业务中我们往往需要更多的空间。而且在Java中并不存在无符号整形,只有几个操作无符号的静态方法。1GB = 1024MB,1MB = 1024KB,1KB = 1024B, 1B = 8b很显然这种存储是不太优雅的,对于这种大数据量的去重,我们可以使用位图Bitmap。​ 顺手推几个技术大厂的机会,前、后端or测试,感兴#畅聊专区#趣就试试 BitmapBitmap,位图,首先看它的名字,比特map,首先我们听到map,一般都有去重的功能,bitmap听名字就像使用bit存储的map。确实,位图是使用bit数组表示的,它只存储0或者1,因此我们可以把全部的QQ号放到位图中,当index位置为1时表示已经存在。假如我们要判断2924357571是否存在,那么我们只需要看index为2924357571的值是否为1,如果为1则表示已经存在。位图使用1个比特表示一个数是否存在,那么使用无符号整数表示QQ号,4字节2^32-1是4294967295,内存需要4294967295/8/1024/1024≈512MB。使用Java编程时,我们使用位图一般是通过的redis,在redis中位图常用的是以下三个命其他作用大数据量去重,Bitmap其极致的空间用在大数据量去重非常合适的,除了QQ号去重,我们还可以用在比如订单号去重;爬取网站时URL去重,爬过的就不爬取了。数据统计,比如在线人员统计,将在线人员id为偏移值,为1表示在线;视频统计,将全部视频的id为偏移存储到Bitmap中。布隆过滤器(BloomFilter),布隆过滤器的基础就是使用的位图,只不过布隆过滤器使用了多个哈希函数处理,只有当全部的哈希都为1,才表示这个值存在。布隆过滤器布隆过滤器一般会使用多个哈希函数,计算出对应的hash对应多个位图下标值,如果都为1,表示这个值存在。例如hutool工具中布隆过滤器的实现类BitMapBloomFilter默认就提供了5个哈希函数。 public BitMapBloomFilter(int m) { int mNum =NumberUtil.div(String.valueOf(m), String.valueOf(5)).intValue(); long size = mNum * 1024 * 1024 * 8; filters = new BloomFilter[]{ new DefaultFilter(size), new ELFFilter(size), new JSFilter(size), new PJWFilter(size), new SDBMFilter(size) }; } 优点:相较位图,布隆过滤器使用多个hash算法,我们就可以给字符串或对象存进去计算hash了,不像位图一样只能使用整形数字看偏移位置是否为1。缺点:可能产生哈希冲突,如果判断某个位置值为1,那么可能是产生了哈希冲突,所以,布隆过滤器会有一定误差。
40亿QQ号,如何去重?
产品描述MT3420B是一个1.5MHz恒定频率,电流模式降压转换器。它是理想的便携式设备,需要非常大电流的单电池锂离子电池,同时在峰值负载条件下仍然达到超过90%的效率。MT3420B还可以在100%的占空比下运行,延长便携式系统的电池寿命,而轻负载操作为噪声敏感应用提供非常低的输出纹波。MT3420B可以从2.3V到6V的输入电压提供高达2A的输出负载电流,输出电压可以调节到低至0.6V。高开关频率最小化的外部组件,同时保持低开关损耗。内部坡度补偿设置允许装置以较小的电感值运行,以优化尺寸和提供有效的操作。M3420B提供了一个低轮廓(1毫米)6针,薄的SOT包,并可在一个可调的版本。该设备提供了两种操作模式,PWM控制和PFM模式切换控制,这允许在更广泛的负载范围内实现高效率。产品特点高效率:高达96%的1.5MHz恒频运行2A输出电流不需要肖特基二极管2.3V至6V输入电压范围输出电压,低至0.6VPFM模式高效光负荷100%占空比低静止电流:40μA短路保护热故障保护,涌入电流限制和软启动<1μA关闭当前SOT23-6软件包 MT3420B是一个高输出电流单片开关模式降压DC-DC转换器。该设备工作在一个固定的1.5MHz开关频率,并使用一个斜坡补偿电流模式架构。这种降压DC-DC转换器可以在VIN =为3.6V下提供最多2A的输出电流,输入电压范围从2.3V到6V。它最小化了外部组件的尺寸,并在重负载范围内优化了效率。斜率补偿允许器件在更大的电感值范围内保持稳定,从而使用较小的DCR值(1μH到4.7μH)来实现更高的效率。在输出端只需要一个小的旁路输入电容器。可调输出电压可编程与外部反馈到任何电压,范围从0.6V到接近输入电压。它使用内部MOSFETs来实现高效率,并可以通过使用0.6V的内部参考产生非常低的输出电压。在退出运行时,转换器占空比增加到100%,输出电压跟踪输入电压减去p通道高侧MOSFET和电感器DCR的低RDS(ON)下降。内部误差放大器和补偿器提供了卓越的性能图1显示了MT3420B的基本应用电路。MT3420B可以通过外部进行编程。图1中的电阻R1和R2编程输出调节在高于0.6V的电压。为了限制外部反馈电阻串的偏置电流所需的抗扰性,R2的最小建议值为59kΩ。虽然较大的值会进一步降低静止电流,但也会增加反馈节点的阻抗,使其对外部噪声和干扰更加敏感。表1总结了各种输出电压的电阻值,R2设置为59kΩ为良好的噪声豁免性,或316kΩ为减少无负载输入电流。外部电阻器根据以下公式设置输出电压#嘉立创PCB#
(航天民芯)代理 MT3420B SOT-23-6 DC-DC电源芯片
产品描述MT2492是一个完全集成的,高效的2A同步整流降压转换器。MT2492在一个较宽的输出电流负载范围内高效工作。该设备提供了两种操作模式,PWM控制和PFM模式切换控制,这允许在更广泛的负载范围内实现高效率。MT2492需要最少数量的现成的标准外部组件,并可在一个6针SOT23 ROHS兼容包。产品特点高效率:高达96%的,600 KHz频率操作,2A输出电流不需要肖特基二极管,需要4.5V到16V的输入电压范围0.6V参考,斜率补偿电流模式控制为优秀的线和负载瞬态响应集成内部补偿,稳定与低ESR陶瓷输出电容器过电流保护与弯杯模式,热关机,涌电流限制和软启动可在SOT23-6包,-40°C到+85°C温度范围MT2492是一个电流模式降压DC/DC转换器,提供了优秀的瞬态响应,没有额外的外部补偿组件。该设备包含一个内部、低电阻、高电压功率的MOSFET,并在高600K的工作频率下工作,以确保一个紧凑、高效的设计和优良的交流和直流性能。当电感器电流峰值超过设定的电流极限阈值时,MT2492的循环超过电流极限。同时,输出电压开始下降,直到FB低于低电压(UV)阈值,通常比参考值低30%。一旦UV被触发,MT2492进入打嗝模式,定期重新启动部件。当输出对地死地短路时,这种保护模式特别有用。大大降低了平均短路电流,以缓解热问题和保护调节器。一旦过电流状态被消除,MT2492就会退出打嗝模式 #嘉立创PCB#
(航天民芯)代理 MT2492 SOT-23-6 DC-DC电源芯片
社区数据
今日帖子
-
今日互动量
-
在线人数
-
帖子总量
-
用户总量
-
推荐话题 换一批
#嘉立创PCB#
#畅聊专区#
#DIY设计#
#PCB有什么好玩的#
#星火计划2024#
#嘉立创#
#ESP8266/32#
#WiFi/以太网#
查看更多热门话题
粤ICP备2023121300号 · 用户协议 · 隐私政策 · 侵权举报 · ISO/IEC · Copyright © 2024 嘉立创社区版权所有
服务热线:18682363881 ·  服务时间:周一至周六 9::00-18:00 · 联系地址:中国·深圳(福田区商报路奥林匹克大厦27楼) · 媒体沟通:pr@jlc.com · 集团介绍