手写Promise的静态方法
最近对promise原理的理解,手写下其中的静态方法。
手写Promise的静态方法
- 1. Promise.resolve
- 2. Promise.reject
- 3. Promise.all
- 4. Promise.any
- 5. Promise.race
- 6. Promise.allSettled
1. Promise.resolve
首先就是resolve方法,它会接收一个值,总是会将其转换为一个状态为fulfilled的Promise对象,如果传入的值本身就是Promise对象,那就直接返回。
了解原理代码便呼之欲出了:
Promise.resolve = function (value) {if (value instanceof Promise) {return value; // 当传入的是一个Promise对象时,直接返回}return new Promise(resolve => resolve(value)) // 否则返回一个状态为fulfilled的Promise
}
先对传入的value进行类型判断,使用instance of进行判断。instance of是通过原型链进行类型判断的,所以当value是Promise对象时,就会得到true,直接返回value即可;如果value不是Promise对象,那就返回一个新的Promise对象并且使用resolve包裹一下,就行了。
2. Promise.reject
reject方法就是与resolve方法相反的,总是会得到一个状态为rejected的promise对象,不一样的是,不管传入的value是什么,都返回一个状态为rejected的promise对象:
Promise.reject = function (value) {// 不管传入的是什么,直接返回一个状态为rejected的promisereturn new Promise((resolve, reject) => reject(value))
}
3. Promise.all
然后是all方法。
all方法会接收一个由Promise对象组成的数组,如果数组中的Promise对象状态都是fufilled,返回一个由这些Promise对象的值组成的新的状态为fufilled的promise;只要有一个失败就立即失败,返回一个状态为rejected的Promise,值为第一个失败的promise对象的值。
了解了原理,我们就来手写代码:
Promise.all = function (PromiseArr) {let i = 0, result = [] // i用来记录PromiseArr中成功的promise对象,result用来保存promise对象的值return new Promise((resolve, reject) => { // all方法会返回一个新的promise对象})
}
我们会使用一个i来记录PromiseArr中成功的promise对象个数,每成功一个i就加一,便把这个promise对象的值存放到result数组中。然后all最后一定会返回一个新的Promise,于是我们return new Promise。
Promise.all = function (PromiseArr) {let i = 0, result = [] // i用来记录PromiseArr中成功的promise对象,result用来保存promise对象的值return new Promise((resolve, reject) => { // all方法会返回一个新的promise对象PromiseArr.forEach((item, index) => { // 遍历传入的promise对象数组Promise.resolve(item)})})
}
然后我们遍历传入的PromiseArr数组,使用resolve方法将PromiseArr数组中的每个元素都转换为promise。如果item是promise,resolve方法会直接返回它;如果不是,返回一个promise对象。
于是,我们就可以在后面接then了:
Promise.all = function (PromiseArr) {let i = 0, result = [] // i用来记录PromiseArr中成功的promise对象,result用来保存promise对象的值return new Promise((resolve, reject) => { // all方法会返回一个新的promise对象PromiseArr.forEach((item, index) => { // 遍历传入的promise对象数组Promise.resolve(item).then(val => { // 利用resolve方法将promise数组中的元素都变为promisei++ // 每成功一个就加1result[index] = val // 按索引记录值if (i === PromiseArr.length) { // 当index等于promise数组长度时,说明全部成功,直接resolveresolve(result)}},err => {reject(err) // 只要有一个失败,立即失败})})})
}
当item状态是fufilled时,i就加一,并根据索引将item的值存放到result中,最后当i的值等于PromiseArr数组的长度时,说明PromiseArr数组每个promise都成功了,就resolve这个result数组;否则,只要有一个失败,就立即reject。
这样,一个基本的all方法我们就实现了。
4. Promise.any
any方法和all方法比较类似。any方法是当传入的promise数组每个状态都为rejected时返回一个状态为rejected的新Promise;否则,只要有一个状态为fufilled,就立即成功,返回第一个是 fulfilled 的新实例。
Promise.any = function (PromiseArr) {let i = 0 // 用来记录PromiseArr中失败的个数return new Promise((resolve, reject) => { // any方法会返回一个新的promise对象})
}
开头和all方法比较类似,我们使用一个i来记录PromiseArr数组中失败的个数,然后any方法会返回一个新的promise对象,于是我们就return new Promise。
Promise.any = function (PromiseArr) {let i = 0 // 用来记录PromiseArr中失败的个数return new Promise((resolve, reject) => { // any方法会返回一个新的promise对象PromiseArr.forEach((item, index) => { // 遍历PromiseArr数组Promise.resolve(item)})})
}
同样,我们使用resolve方法将数组中的每一项item都转化为promise对象。
Promise.any = function (PromiseArr) {let i = 0 // 用来记录PromiseArr中失败的个数return new Promise((resolve, reject) => { // any方法会返回一个新的promise对象PromiseArr.forEach((item, index) => { // 遍历PromiseArr数组Promise.resolve(item).then(val => { // 利用resolve方法将PromiseArr数组中的每个元素都变为promise对象resolve(val) // 只要有一个成功,立即成功},err => {i++ // 记录失败的次数if (i === PromiseArr.length) { // 当数组中全部失败时reject(new AggregateError('All promises were rejected'))}})})})
}
然后,每失败一次,i就加1。最后,当i等于PromiseArr数组的长度时,说明全部失败,就reject,值为 AggregateError 的错误;否则,只要有一个成功,立即成功。
这样,我们就实现了一个基本的any方法。
5. Promise.race
我们紧接着来手写一下race方法,race方法的原理是会返回第一个得出状态的promise的值,无论成功还是失败。
原理很简单,代码也比较简单:
Promise.race = function (PromiseArr) {return new Promise((resolve, reject) => { // race方法会返回一个新的promise对象PromiseArr.forEach((item, index) => { // 遍历处理PromiseArr中元素Promise.resolve(item).then(val => {resolve(val) // 返回第一个成功的},err => {reject(err) // 或者第一个失败的})})})
}
6. Promise.allSettled
我们来手写一下今天的最后一个静态方法,也是比较复杂的一个,allSettled。
它主要是用来观察一组promise对象数组发生的变化,所有 Promise 的状态都变化了,那么新返回一个状态是 fulfilled 的 Promise,且它的值是一个数组,数组的每项由所有 Promise 的值和状态组成的对象;
Promise.allSettled = function (PromiseArr) {let result = []return new Promise((resolve, reject) => {})
}
我们使用result数组来保存最后的结果,allSettled方法也会返回一个新的promise对象,于是我们return new Promise。
Promise.allSettled = function (PromiseArr) {let result = []return new Promise((resolve, reject) => {PromiseArr.forEach((item, index) => {Promise.resolve(item)})})
}
同样,使用resolve方法将数组的每一项转换为promise对象。
Promise.allSettled = function (PromiseArr) {let result = []return new Promise((resolve, reject) => {PromiseArr.forEach((item, index) => {Promise.resolve(item).then(val => {result.push({status: 'fulfilled',value: val,})if (result.length === PromiseArr.length) {resolve(result)}},err => {result.push({status: 'rejected',reason: err,})if (result.length === PromiseArr.length) {resolve(result)}})})})
}
我们将每一个item的值都存入到result数组中,并且要记录每个item的状态,allSettled总是返回一个状态为fufilled的新promise,最后,当result的长度等于PromiseArr的长度,说明处理完毕,直接resolve这个result数组。
这样,我们也实现了一个基本的allSettled方法。
相关文章:
手写Promise的静态方法
最近对promise原理的理解,手写下其中的静态方法。 手写Promise的静态方法 1. Promise.resolve2. Promise.reject3. Promise.all4. Promise.any5. Promise.race6. Promise.allSettled 1. Promise.resolve 首先就是resolve方法,它会接收一个值࿰…...
Python Cookbook-7.8 使用 Berkeley DB 数据库
任务 你想将一些数据做持久化处理,而且也想体验一下BerkeleyDB数据库的简洁和高效。 解决方案 如果以前在你的计算机中安装过 BerkeleyDB,Python标准库附带的bsddb包(以及可选的 bsddb3,用于访间Berkeley DBrelease 3.2数据库)可以被用来作…...
云手机虚拟地址技术的运营场景
云手机虚拟地址技术通过模拟地理位置(GPS/IP地址)与设备指纹,结合云端虚拟化能力,在多个商业场景中实现突破性应用。以下是其核心运营场景及技术实现路径的深度解析: 一、跨境电商与区域化运营 本地化合规与流量突破 目…...
操作符详解(2)
目录 9 结构成员访问操作符 9.1.2 结构体变量的定义和初始化 9.2 结构体成员的直接访问 10 操作符的属性:优先级、结合性 10.1 优先级 11 表达式求值 11.1 整型提升 11.2 算术转换 11.3 问题表达式解析 11.3.1 表达式1 11.3.2 表达式2 11.3.3 表达式3 1…...
责任链设计模式
一、核心接口定义 MyAbstractChainHandler<T> 接口继承自 Ordered 接口,用于实现链式处理逻辑。 import org.springframework.core.Ordered;public interface MyAbstractChainHandler<T> extends Ordered {void handle(T requestParam);String getCha…...
【银河麒麟高级服务器操作系统】服务器外挂存储ioerror分析及处理分享
更多银河麒麟操作系统产品及技术讨论,欢迎加入银河麒麟操作系统官方论坛 forum.kylinos.cn 了解更多银河麒麟操作系统全新产品,请点击访问 麒麟软件产品专区:product.kylinos.cn 开发者专区:developer.kylinos.cn 文档中心&a…...
麒麟信安举办特种行业核心代理商中级技术认证培训班
近日,麒麟信安举办为期一周的特种行业核心代理商中级技术认证培训班,吸引了众多来自各地代理商公司的技术骨干踊跃参与。 此次培训班旨在赋能合作伙伴,助力其深入理解并熟练运用麒麟信安产品的核心优势,进一步提升在特种行业中的业…...
非对称加密:为什么RSA让“公开传密”成为可能
在1977年之前,加密世界遵循一个铁律:想要安全通信,必须先秘密交换密钥。无论是凯撒密码还是二战时的恩尼格玛机,都依赖发送方和接收方预先共享同一把“钥匙”。但RSA算法的出现颠覆了这一规则——它让陌生人可以在完全公开的环境下…...
阿里云ddos云防护服务器有哪些功能?ddos防御手段有哪些??
阿里云ddos云防护服务器有哪些功能?ddos防御手段有哪些?? DDoS(分布式拒绝服务)云防护服务器通过多种技术和策略来抵御大规模网络攻击,确保服务的高可用性。以下是其主要功能和防御手段的详细说明: 一、D…...
如何防止域名DNS被劫持?
防止域名DNS被劫持需要综合技术手段和管理措施,以下是一份详细的防护方案: --- ### **一、基础防护措施** 1. **选择可靠的域名注册商和DNS服务商** - 优先选择支持DNSSEC、提供多因素认证(MFA)的知名服务商(如Cl…...
桥隧坡灾害监测报警:用科技筑起生命安全的“智能防线”
.2024年,梅大高速茶阳路段高边坡塌方事件造成重大伤亡,举国痛心。这场悲剧再次敲响警钟:桥梁、隧道、边坡等高风险区域的实时监测与精准报警,已成为交通安全的生命线。如何用技术手段在灾害发生前“抢跑”,第一时间阻断…...
K8S常见问题汇总
一、 驱逐 master 节点上的所有 Pod 这会“清空”一个节点(包括 master)上的所有可驱逐的 Pod: kubectl drain <master-node-name> --ignore-daemonsets --delete-emptydir-data--ignore-daemonsets:保留 DaemonSet 类型的…...
ideal创建Springboot项目(Maven,yml)
以下是使用 IntelliJ IDEA 创建基于 Maven 的 Spring Boot 项目并使用 YAML 配置文件的详细步骤: 一、创建 Spring Boot 项目 启动项目创建向导 打开 IntelliJ IDEA,点击“File”->“New”->“Project”。 在弹出的“New Project”窗口中&#…...
解决:‘java‘ 不是内部或外部命令,也不是可运行的程序-Java环境变量配置(含JDK8、JDK21安装包一站式配置)
在使用命令行运行 .jar 文件时,很多用户会遇到如下错误提示: java 不是内部或外部命令,也不是可运行的程序或批处理文件。 这个报错表明系统无法识别 java 命令,通常是由于 Java 没有正确安装,或是系统环境变量没有配…...
android.app.Fragment和androidx.fragment:fragment的区别
android.app.Fragment 与 androidx.fragment.app.Fragment 的区别 这两个 Fragment 实现代表了 Android 碎片化开发的两个时代,以下是它们的核心区别: 一、起源与演变 android.app.Fragmentandroidx.fragment.app.Fragment引入时间Android 3.0 (API 1…...
OrangePi Zero 3学习笔记(Android篇)3 - 串口
目录 1. 找到串口号 2. 修改串口权限 3. 串口类 3.1 serialport.hpp 3.2 serialport.cpp 3.2.1 构造函数 3.2.2 Open函数 3.2.3 Close函数 3.2.4 Write函数 3.2.5 Read函数 3.2.6 SetFlowCtrl函数 4. 测试程序 5. 编译 6. 运行验证 除了默认的UART用于shell&…...
Node.js 技术原理分析系列9——Node.js addon一文通
Node.js 是一个开源的、跨平台的JavaScript运行时环境,它允许开发者在服务器端运行JavaScript代码。Node.js 是基于Chrome V8引擎构建的,专为高性能、高并发的网络应用而设计,广泛应用于构建服务器端应用程序、网络应用、命令行工具等。 本系…...
HBuilderX安卓真机运行安装失败解决汇总
前置方案 1. 确认USB调试和连接模式 (1)开启USB调试:进入手机设置 > 开发者选项 > 确保USB调试已开启(如无开发者选项,连续点击“版本号”激活)。 (2)连接模式:将…...
TensorFlow 2.x入门实战:从零基础到图像分类项目
TensorFlow 2.x入门实战:从零基础到图像分类项目 前言 TensorFlow是Google开发的开源机器学习框架,已成为深度学习领域的重要工具。TensorFlow 2.x版本相比1.x有了重大改进,更加易用且功能强大。本文将带你从零开始学习TensorFlow 2.x&…...
SpringBoot+Dubbo+Zookeeper实现分布式系统步骤
SpringBootDubboZookeeper实现分布式系统 一、分布式系统通俗解释二、环境准备(详细版)1. 软件版本2. 安装Zookeeper(单机模式) 三、完整项目结构(带详细注释)四、手把手代码实现步骤1:创建父工…...
数据中台-常用工具组件:DataX、Flink、Dolphin Scheduler、TensorFlow和PyTorch等
数据实施服务工具组件概览 数据中台的数据实施服务涵盖 数据采集、处理、调度、分析与应用 全流程,以下为关键工具组件及其作用: 工具类型核心功能典型应用场景DataX离线数据采集多源异构数据批量同步数据仓库ODS层数据导入Apache Flink实时计算引擎流…...
【PostgreSQL数据分析实战:从数据清洗到可视化全流程】电商数据分析案例-9.2 流量转化漏斗分析
👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 9.2 流量转化漏斗分析:从数据清洗到可视化全流程实战一、背景与目标二、数据准备与清洗2.1 数据来源与字段说明2.2 数据清洗步骤2.2.1 去除无效数据2.2.2 处理时…...
结合Splash与Scrapy:高效爬取动态JavaScript网站
在当今的Web开发中,JavaScript的广泛应用使得许多网站的内容无法通过传统的请求-响应模式直接获取。为了解决这个问题,Scrapy开发者经常需要集成像Splash这样的JavaScript渲染引擎。本文将详细介绍Splash JS引擎的工作原理,并探讨如何将其与S…...
[计算机科学#10]:早期的计算机编程方式
【核知坊】:释放青春想象,码动全新视野。 我们希望使用精简的信息传达知识的骨架,启发创造者开启创造之路!!! 内容摘要:1804年,为了在织布机上编织出丰富多彩的…...
JAVA:Spring Boot 集成 Lua 的技术博客
1、简述 在现代开发中,Lua 以其轻量级、高性能以及易嵌入的特点广泛用于脚本扩展、游戏开发以及配置处理场景。将 Lua 与 Spring Boot 集成,可以在 Java 项目中实现动态脚本功能,增强项目的灵活性和动态配置能力。 样例代码: https://gitee.com/lhdxhl/springboot-example…...
代码随想录算法训练营 Day40 动态规划Ⅷ 股票问题
动态规划 题目 121. 买卖股票的最佳时机 - 力扣(LeetCode) 使用二维 dp 数组表示 1. dp[i][0] 表示持有股票的最大金额,dp[i][1] 表示不持有股票的最大金额,表示盈利结果 2. 递推公式由前一天持有金额和是否买股票决定 决定是否…...
【已解决】WORD域相关问题;错误 未找到引用源;复制域出错;交叉引用域到底是个啥
(微软赶紧倒闭 所有交叉引用域,有两个状态:1.锁定。2.手动。可通过编辑->链接查看。 “锁定”状态域的能力: 1. 导出PDF格式稳定(【已解决】WORD导出PDF时,参考文献上标自动被取消/变为正常文本_word…...
小米 MiMo 开源:7B 参数凭什么 “叫板” AI行业巨头?
目录 一、技术革命的起点:小米AI战略的“破局者” 1.1 战略背景:从硬件厂商到AI基础设施提供商 1.2 团队揭秘:“天才少女”罗福莉与小米AI梦之队 二、技术架构解析:7B参数如何实现“推理跃迁” 2.1 核心技术原理 2.2 技术指…...
构建高可用性的LVS-DR群集:实现无缝的负载均衡与故障转移
目录 一、LVS-DR集群 1.LVS-DR工作原理 2.数据包流向分析 3.LVS-DR模式特点 二、直接路由模式(LVS-DR) 1.资源清单 2.配置负载调度器(lvs) 3.配置节点服务器(web1、web2) 4.测试LVS群集 5.使用NFS发布共享资源(nfs上) …...
低光图像增强新色彩空间HVI:技术突破与创新解析(HVI: ANewColor Space for Low-light Image Enhancement)
摘要 低光图像增强(LLIE)是计算机视觉领域的关键任务,旨在从受损的低光图像中恢复细节信息。针对现有方法在标准RGB(sRGB)空间易产生色偏与亮度伪影的问题,以及HSV色彩空间转换引发的红/黑噪声问题…...
Abaqus学习笔记
目录 Abaqus介绍 学习资源 编辑Abaqus/CAE abaqus下载安装 abaqus基本操作 Abaqus启动 新建模型 编辑 编辑修改界面背景 编辑编辑结果信息的显示与否 编辑计算结果信息字体设置 编辑允许多绘图状态 单位量纲 视图操作 事前说明 ODB文件 本构关系…...
AquaCrop 模型新视角:多技术助力农业精准水管理
技术点目录 模型原理介绍与数据要求及模型分析数据制备、模型运行与案例实践(界面GUI版本)模型优化与敏感性分析(基于R语言实践)源代码分析(基于FORTRAN)未来气候变化影响分析与案例实践(基于Py…...
从知识图谱到精准决策:基于MCP的招投标货物比对溯源系统实践
前言 从最初对人工智能的懵懂认知,到逐渐踏入Prompt工程的世界,我们一路探索,从私有化部署的实际场景,到对DeepSeek技术的全面解读,再逐步深入到NL2SQL、知识图谱构建、RAG知识库设计,以及ChatBI这些高阶应用。一路走来,我们在AI的领域里一步一个脚印,不断拓展视野和能…...
【平面波导外腔激光器专题系列】1064nm单纵模平面波导外腔激光器
摘要:我们介绍了平面波导外腔二极管激光器 (PW-ECL) 的特性。据我们所知,这是第一款蝶形封装的 1064nm半导体激光器,其可以稳定锁定到外部参考频率。我们从精密实验的角度评估了它的性能,特别是使用碘的超精细吸收线,在…...
C++ 算法学习之旅:从入门到精通的秘籍
在编程的浩瀚宇宙中,C 算法宛如璀璨的星辰,照亮我们前行的道路。作为一名 C 算法小白,或许你和我一样,怀揣着对算法的好奇与憧憬,却又在学习的道路上感到迷茫。别担心,今天我就和大家分享一下如何学习各种基…...
按摩椅上的气囊系统 是现代按摩椅中非常关键的组成部分,它与机芯系统相辅相成,为用户提供全方位、更接近真人按摩的体验
按摩椅上的气囊系统是现代按摩椅中非常关键的组成部分,它与机芯系统相辅相成,为用户提供全方位、更接近真人按摩的体验。 一、按摩椅气囊的产生背景 1. 传统按摩方式的局限 早期的按摩椅主要依赖机械式的“凸轮电机”或简单的机芯滚轮结构,…...
配置Hadoop集群环境-使用脚本命令实现集群文件同步
(一)Hadoop的运行模式 hadoop一共有如下三种运行方式: 1. 本地运行。数据存储在linux本地,测试偶尔用一下。我们上一节课使用的就是本地运行模式hadoop100。 2. 伪分布式。在一台机器上模拟出 Hadoop 分布式系统的各个组件&…...
Linux系统(OpenEuler22.03-LTS)部署FastGPT
在 openEuler 22.03 LTS 系统上通过 Docker Compose 安装 FastGPT 的步骤如下: 官方参考文档:https://doc.fastgpt.cn/docs/development/docker/ 1. 安装 Docker 和 Docker Compose 可以参考我之前离线安装Docker的文章:openEuler 22.03 LT…...
FastExcel 本地开发和Linux上上传Resource文件的差异性
不能直接通过路径来获取 这个是一个下载导出文件的操作 GetMapping(value "/export/all") public void exportAll(HttpServletResponse response, LaylineListReq req) throws IOException {// 从类路径下获取 Excel 文件资源ClassPathResource classPathResource…...
Excel学习笔记
在excel表格中,某列的数据最大,则整行都红色底色标出,怎么实现? 更改x值,excel图表上动态显示 该值的Y值且动态显示十字交叉线 为了实现如下图所示的效果,需要做出几个辅助列就行。 step1:先写…...
数据中台-数仓分层结构【Doris】
数据仓库采用Doris进行搭建,并分为ODS/DWD/DWM/DWS/ADS等层级结构进行分层数据存储。Doris是百度开源的MPP数据库,可有效支撑大数据量的数据计算和分布式扩展存储。 数据仓库分层架构设计目标 解耦与复用性:通过分层隔离原始数据与业务逻辑&a…...
使用Jmeter对AI模型服务进行压力测试
一、JMeter介绍 Apache JMeter 是一款开源的性能测试工具,主要用于评估Web应用程序的负载和性能。它支持多种类型的测试,包括但不限于: 负载测试:模拟大量用户访问系统以检测其在高负载下的表现。性能测试:评估系统在…...
测试用例管理平台哪些好用?9款主流测试平台对比
在当今软件开发领域,测试用例管理平台已成为提升产品质量和团队协同效率的关键工具。本文将围绕“测试用例管理平台”这一核心关键词,全面解析市面上9款主流产品,帮助企业管理者和测试团队快速了解各平台的核心优势和适用场景,从而…...
C++函数传值与传引用对比分析
在C编程中,函数参数传递的方式直接影响程序的性能、内存管理以及代码逻辑的正确性。传值(Pass by Value)和传引用(Pass by Reference)是两种最常用的参数传递方式,它们各有优缺点,适用于不同的场…...
【se-res模块学习】结合CIFAR-10分类任务学习
继CIFAR-10图像分类:【Res残差连接学习】结合CIFAR-10任务学习-CSDN博客 再优化 本次训练结果在测试集上的准确率表现可达到90%以上 1.训练模型(MyModel.py) import torch import torch.nn as nnclass SENet(nn.Module): # SE-Net模块def…...
二元随机响应(Binary Randomized Response, RR)的翻转概率
随机响应(Randomized Response)机制 ✅ 回答核心: p 1 1 e ε 才是「翻转概率」 \boxed{p \frac{1}{1 e^{\varepsilon}}} \quad \text{才是「翻转概率」} p1eε1才是「翻转概率」 而: q e ε 1 e ε 是「保留真实值」…...
湖北理元理律师事务所:债务优化中的“生活保障”方法论
债务危机往往伴随生活质量骤降,如何在还款与生存间找到平衡点,成为债务优化的核心挑战。湖北理元理律师事务所基于多年实务经验,提出“双轨并行”策略:法律减负与生活保障同步推进。 债务优化的“温度法则” 1.生存资金预留机制…...
RFID智能书柜:精准定位,找书告别 “大海捞针”
在传统图书馆的浩瀚书海,找书无异于在错综复杂的迷宫里徘徊。读者在书架间来回奔波,耗费大量时间精力,还常一无所获。RFID智能书柜的出现,彻底改写了这一局面。它搭载的RFID读写器与天线协同工作,能实时精准定位贴有RF…...
视觉图像处理及多模态融合初探
(一)指标汇总 1. 图像采集与质量提升 指标描述可能的量化值图像清晰度反映图像中物体的边缘和细节的清晰程度例如:1-10 分(1 为极不清晰,10 为非常清晰)噪声水平表示图像中随机噪声的多少例如:噪声强度百分比(0%-100%)畸变程度描述图像中物体形状的变形程度例如:畸变…...
射频前端模组芯片(PA)三伍微电子GSR2337 兼容替代SKY85337, RTC7646, KCT8247HE
射频前端模组芯片(PA)三伍微电子GSR2337 兼容替代SKY85337, RTC7646, KCT8247HE 型号GSR2337 频率: 2.4 GHz 类型: FEM (PALNASW) WIFI: 11n/ac/ax 功率: 21dBmEVM-43dB5V 封装: 3*3 mm 电压: 3.3V & 5V P2P: SKY85…...