Node学习记录-until实用工具
来源:Nodejs 第十八章(util)
util 是Node.js内部提供的很多实用或者工具类型的API
util.promisify
用于将遵循Node回调风格(即最后一个参数为回调函数)的函数转换成返回Promise的函数,这样可以使得异步代码更容易使用和维护
常规获取node版本
const {exec} = require('child_process')
exec('node -v', (err, stdout, stderr) => {if (err) {console.error(`执行出错:${err}`);return;}console.log(`stdout: ${stdout}`);console.error(`stderr: ${stderr}`);
})
promise风格获取,Promiseify 接受 original一个函数体
const util = require('util');
const {exec} = require('child_process');
const execPromise = util.promisify(exec)
execPromise('node -v').then(res =>{console.log('res', res)
}).catch(err =>{console.log('err', err)
})
promisify实现原理
1、promisify返回一个新的函数
2、接收一个函数,作为参数,并在返回的函数中接收真正的参数,然后返回一个promise
3、调用真正的函数,并将参数透传给original,如果失败了就reject,如果成功就resolve
util.callbackify(original)
将promise类型的API转回成回调函数形式
const util = require('util')
const fn = (type) =>{if(type == 1){return Promise.resolve('test')}return Promise.reject('error')
}
const callback= util.callbackify(fn)
callback(1, (err, val) =>{console.log(err,val)
})
const util = require('util')
const fn = (type) =>{if(type == 1){return Promise.resolve('test')}return Promise.reject('error')
}
const callback= util.callbackify(fn)
callback(1122, (err, val) =>{console.log(err,val)
})
callbackify实现原理
1、接收原始函数,callbackify接受一个返回promise的函数作为参数
2、创建一个新函数:这个新函数会接收与原始函数相同的参数,但会在最后多一个回调函数(node的回调风格)
3、处理promise的结果
如果Promise成功(resolved),则调用回调函数并传递null作为第一个参数,表示没有错误,以及Promise的结果作为第二个 参数
如果Promise失败(rejected), 则调用回调函数并传递错误对象作为第一个参数,第二个参数为undefined
function callbackify(originalFunction){return function(...args){// 获取最后一个参数作为回调函数const callback = args.pop();if(typeof callback !== 'function'){throw new TypeError('The last argument must be a function')}// 调用原始函数,并获取promiseconst promise = originalFunction.apply(this, args)if(!(promise instanceof Promise)){return callback(new TypeError('The function must return a Promise'))}// 处理promise结果promise.then(result =>{// promise成功,调用回调函数并传递null和结果callback(null, result)}, error =>{// promise失败,调用回调函数并传递错误callback(error)}) }
}
// 使用
const fn = (type) => {if (type === 1) {return Promise.resolve('test');}return Promise.reject('error');};const callback = callbackify(fn);callback(1, (err, val) => {console.log(err, val); // 输出: null 'test'});callback(2, (err, val) => {console.log(err, val); // 输出: 'error' undefined});
util.format()
使用第一个参数作为类似printf的格式字符串(可包含零个或多个格式说明符)来返回格式化的字符串,每个说明符都替换为来自相应参数的转换后的值,如果说明符没有相应的参数,则不会替换它
格式字符串是由%引导的,用来控制字符串输出的格式
支持的说明符有:
%s: String 将用于转换除 BigInt、Object 和 -0 之外的所有值。 BigInt 值将用 n 表示,没有用户定义的 toString 函数的对象使用具有选项 { depth: 0, colors: false, compact: 3 } 的 util.inspect() 进行检查
%d: Number将用于转换除BigInt和Symbol之外的所有值
%i: parseInt(value, 10)用于除BigInt和Symbol之外的所有值
%f: parseFloat(value) 用于除 Symbol 之外的所有值
%j: JSON.如果参数包含循环引用,则替换为字符串 ‘[Circular]’
%o: Object。具有通用 JavaScript 对象格式的对象的字符串表示形式。类似于具有选项 { showHidden: true, showProxy: true } 的 util.inspect()。这将显示完整的对象,包括不可枚举的属性和代理
%O: Object。具有通用 JavaScript 对象格式的对象的字符串表示形式。类似于没有选项的 util.inspect()。这将显示完整的对象,但不包括不可枚举的属性和代理。
%c:CSS。此说明符被忽略,将跳过任何传入的 CSS
%%:单个百分号 (‘%’)。这不消费参数。
const util = require('util');
//说明符没有相应的参数,则不会替换它
console.log(util.format('%s:%s', 11));//11:%s
//参数多于说明符的数量,则额外的参数将以空格分隔串联到返回的字符串
console.log(util.format('%s:%s', 'foo', 'bar', 'baz'));//foo:bar baz
相关文章:

Node学习记录-until实用工具
来源:Nodejs 第十八章(util) util 是Node.js内部提供的很多实用或者工具类型的API util.promisify 用于将遵循Node回调风格(即最后一个参数为回调函数)的函数转换成返回Promise的函数,这样可以使得异步代…...

【Mac】安装 VMware Fusion Pro
VMware Fusion Pro 软件已经正式免费提供给个人用户使用! 1、下载 【官网】 下拉找到 VMware Fusion Pro Download 登陆账号 如果没有账号,点击右上角 LOGIN ,选择 REGISTER 注册信息除了邮箱外可随意填写 登陆时,Username为…...

解决go run main.go executable file not found in %PATH%
项目场景: 命令行执行go run 都会报 executable file not found in %PATH% 问题描述 最近我发现,我通过命令行,无论是跑什么go文件,都会出现这个错误。但是我通过我的IDE就能跑,于是我也没有管它。 但是最近&#x…...

C++ 手写常见的任务定时器
序言 最近在编写 C 的服务器代码时,我遇到了一个需求,服务器很可能会遇到那些长期不活跃的连接,这些连接占用了一定的资源但是并没有进行有效的通信。为了优化资源使用,我决定实现一个定时器,以便定期检查连接的活跃状…...

【VS+QT】联合开发踩坑记录
最新更新日期:2024/11/05 0. 写在前面 因为目前在做自动化产线集成软件开发相关的工作,需要用到QT,所以选择了VS联合开发,方便调试。学习QT的过程中也踩了很多坑,在此记录一下,提供给各位参考。 1. 环境配…...

PH热榜 | 2024-11-05
DevNow 是一个精简的开源技术博客项目模版,支持 Vercel 一键部署,支持评论、搜索等功能,欢迎大家体验。 Github:https://github.com/LaughingZhu/DevNow 1. FullContext 标语:用自然语言,让你的市场推广流…...

模拟机器人逐字回答,类似于实时回话
代码如下 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> </head><…...

Java学习路线:JUL日志系统(一)日志框架介绍
目录 打印日志 日志的级别 打印文件 日志过滤器 日志输出流程 首先,为什么要使用日志系统? 如果单纯地用System.out.println打印信息,如果项目比较大,存在大量的信息就会显得非常凌乱。 而且,当我们希望在debug的…...

[渲染层网络层错误] net::ERR_CONTENT_LENGTH_MISMATCH 问题解决
问题描述 问题背景 微信小程序访问后端img资源的时候,偶尔出现这个感叹号,图片加载不出来,但是对应的url贴出来在浏览器中访问,或者重新加载是可以访问的。 错误描述 经查询前端报错 [渲染层网络层错误] net::ERR_CONTENT_LE…...

C 语言编程中的常见错误及解决方案
在 C 语言开发中,编译和链接错误是常见的问题,尤其是在处理多个源文件时。本文将总结一些常见的错误,并提供相应的解决方案,以帮助开发者更高效地排查和修复这些问题。 1. 结构体作用域问题 问题描述 在函数参数列表中定义结构体…...

开源模型应用落地-glm模型小试-glm-4-9b-chat-批量推理(二)
一、前言 GLM-4是智谱AI团队于2024年1月16日发布的基座大模型,旨在自动理解和规划用户的复杂指令,并能调用网页浏览器。其功能包括数据分析、图表创建、PPT生成等,支持128K的上下文窗口,使其在长文本处理和精度召回方面表现优异&a…...

【C++篇】数据之林:解读二叉搜索树的优雅结构与运算哲学
文章目录 二叉搜索树详解:基础与基本操作前言第一章:二叉搜索树的概念1.1 二叉搜索树的定义1.1.1 为什么使用二叉搜索树? 第二章:二叉搜索树的性能分析2.1 最佳与最差情况2.1.1 最佳情况2.1.2 最差情况 2.2 平衡树的优势 第三章&a…...

C#-类:声明类、声明类对象
一:类的声明 class 类名 {//特征——成员变量//行为——成员方法//保护特征——成员属性//构造函数和析构函数//索引器//运算符重载//静态成员 }类名:帕斯卡 同一个语句块中的不同类 不能重名 二:声明类对象 2.1 类的声明 ≠ 类对象的声…...

【AIGC】ChatGPT提示词Prompt高效编写技巧:逆向拆解OpenAI官方提示词
博客主页: [小ᶻZ࿆] 本文专栏: AIGC | ChatGPT 文章目录 💯前言💯OpenAI官方提示词的介绍OpenAI官方提示词的结构与组成如何通过分析提示词找到其核心组件 💯OpenAI官方提示词分析案例一:制定教学计划案例二&…...

【linux】端口监听和终止进程
端口监听和终止进程 有时候,即使进程看起来已经关闭,它可能仍然占用着端口。你可以使用 netstat -tulpn | grep <端口号> 来查看哪个进程正在使用该端口,然后使用 kill -9 来强制关闭该进程。 [naienotebook-npu-b1bb152e-7655cb9d4…...

【网络安全】|kali中安装nessus
1、使用 df -h 命令查看磁盘使用情况,确保磁盘容量大于40G 简单粗暴办法:重装系统,装系统中注意磁盘空间相关的选项 //磁盘扩容:https://wiki.bafangwy.com/doc/670/ 2、安装 nessus 安装教程 https://blog.csdn.net/Cairo_A/a…...

Docker可视化管理面板DPanel的安装
本文软件由网友 rui 推荐; 什么是 DPanel ? DPanel 是一款 Docker 可视化管理面板,旨在简化 Docker 容器、镜像和文件的管理。它提供了一系列功能,使用户能够更轻松地管理和部署 Docker 环境。 软件特点: 可视化管理&…...

【android12】【AHandler】【3.AHandler原理篇AHandler类方法全解】
AHandler系列 【android12】【AHandler】【1.AHandler异步无回复消息原理篇】-CSDN博客 【android12】【AHandler】【2.AHandler异步回复消息原理篇】-CSDN博客 其他系列 本人系列文章-CSDN博客 1.简介 前面两篇我们主要介绍了有回复和无回复的消息的使用方法和源码解析&a…...

使用Docker Compose构建多容器应用
💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 使用Docker Compose构建多容器应用 引言 Docker Compose 简介 安装 Docker Compose 创建基本配置 运行多容器应用 查看服务状态 …...

面试知识目录
面试知识目录 八股文 java基础 java反射java HashMap面向对象多线程虚拟机内存 SpringMybatisMySQLPostgresqlSQL优化Nosql...

Rust移动开发:Rust在Android端集成使用介绍
Andorid调用Rust 目前Rust在移动端上的应用,一般作为应用sdk的提供,供各端使用,目前飞书底层使用Rust编写通用组件。 该篇适合对Android、Rust了解,想看如何做整合,如果想要工程源码,可以评论或留言有解疑…...

vue3动态监听div高度案例
案例场景 场景描述:现在左边的线条长度需要根据右边盒子的高度进行动态变化 实践代码案例 HTML部分 <div v-for"(device, index) in devices" :key"index"><!-- 动态设置 .left-bar 的高度 --><div class"left-bar"…...

数据转换 | Matlab基于SP符号递归图(Symbolic recurrence plots)一维数据转二维图像方法
目录 基本介绍程序设计参考资料获取方式 基本介绍 Matlab基于SP符号递归图(Symbolic recurrence plots)一维数据转二维图像方法 符号递归图(Symbolic recurrence plots)是一种一维时间序列转图像的技术,可用于平稳和非平稳数据集;对噪声具有…...

分类算法——逻辑回归 详解
逻辑回归(Logistic Regression)是一种广泛使用的分类算法,特别适用于二分类问题。尽管名字中有“回归”二字,逻辑回归实际上是一种分类方法。下面将从底层原理、数学模型、优化方法以及源代码层面详细解析逻辑回归。 1. 基本原理 …...

只允许指定ip远程连接ssh
我们都会使用securtcrt或者xshell等软件进行远程登录,这样虽然会给我们带来很多便捷,但是同样会存在一定的风险。有很多人专门通过重复的扫描试图破解我们的linux服务器,从而获取免费的“肉鸡”。因此我们可以通过设置hosts.allow和hosts.den…...

Rust 力扣 - 2841. 几乎唯一子数组的最大和
文章目录 题目描述题解思路题解代码题目链接 题目描述 题解思路 我们遍历长度为k的窗口,用一个哈希表记录窗口内的所有元素(用来对窗口内元素去重),我们取哈希表中元素数量大于等于m的窗口总和的最大值 题解代码 use std::coll…...

TwinCL: A Twin Graph Contrastive Learning Model for Collaborative Filtering
TwinCL: A Twin Graph Contrastive Learning Model for Collaborative Filtering 摘要 在推荐和协同过滤领域,图对比学习(Graph Contrasive Learning,GCL)已经成为一种有影响的方法。然而,对比学习有效性的原因还没有…...

如何区分实例化网格中的每个实例
1)如何区分实例化网格中的每个实例 2)项目在模拟器上切换程序后有概率画面冻结 3)Unity工程导入团结引擎,GUID会变化,导致引用关系丢失 4)Mask在Android平台下渲染异常 这是第407篇UWA技术知识分享的推送&a…...

理解 WordPress | 第一篇:与内容管理系统的关系
初步了解 WordPress 在互联网世界里,WordPress 是一个家喻户晓的名字。它是一个开源的内容管理系统(Content Management System,简称 CMS),帮助用户轻松创建和管理网站。WordPress 诞生于 2003 年,最初是一…...

Python游戏脚本之实现飞机大战(附源码)
一.游戏设定 游戏界面如下图所示: 游戏的基本设定: 敌方共有大中小3款飞机,分为高中低三种速度; 子弹的射程并非全屏,而大概是屏幕长度的80%; 消灭小飞机需要1发子弹,中飞机需要8发,大飞机需要20发子弹; 每消灭一架小飞机得1000分,中飞机6000分,大飞…...