Nodejs 第十八章(util)

简介: Nodejs 第十八章(util)

util 是Node.js内部提供的很多实用或者工具类型的API,方便我们快速开发。

由于API比较多 我们介绍一些常用的API

util.promisify

我们之前讲过Node.js 大部分API 都是遵循 回调函数的模式去编写的。

https://juejin.cn/post/7277045020422930488

例如我们之前讲的exec

获取Node版本

import { exec } from 'node:child_process'
exec('node -v', (err,stdout)=>{
   if(err){
      return err
   }
   console.log(stdout)
})

以上就是常规写法

我们使用util的promisify 改为promise 风格 Promiseify 接受 original一个函数体

import { exec } from 'node:child_process'
import util from 'node:util'
const execPromise = util.promisify(exec)
execPromise('node -v').then(res=>{
    console.log(res,'res')
}).catch(err=>{
    console.log(err,'err')
})

剖析promiseify如何实现的

  1. 第一步Promiseify是返回一个新的函数
const promiseify = () => {
   return () => {
  }
}
  1. promiseify接受一个函数,并且在返回的函数才接受真正的参数,然后返回一个promise
const promiseify = (original) => {
   return (...args) => {
     return new Promise((resolve,reject)=>{
     })
  }
}
  1. 调用真正的函数,将参数透传给original,如果失败了就reject,如果成功了,就返回resolve,如果有多个返回一个对象。
const promiseify = (original) => {
    return (...args) => {
        return new Promise((resolve, reject) => {
            original(...args, (err, ...values) => {
                if (err) {
                    return reject(err)
                }
                if (values && values.length > 1) {
                    let obj = {}
                    console.log(values)
                    for (let key in values) {
                        obj[key] = values[key]
                    }
                    resolve(obj)
                } else {
                    resolve(values[0])
                }
            })
        })
    }
}

这样可以大致实现但是拿不到values 的key 因为 nodejs内部 没有对我们开放 这个Symbol kCustomPromisifyArgsSymbol

所以输出的结果是 { '0': 'v18.16.0\n', '1': '' } 正常应该是 { stdout: 'v18.16.0\n', stderr: '' }

但是我们拿不到key,只能大概实现一下。

util.callbackify

这个API 正好是 反过来的,将promise类型的API变成 回调函数。

import util from 'node:util'
const fn = (type) => {
    if(type == 1){
        return Promise.resolve('test')
    }
    return Promise.reject('error')
}
const callback = util.callbackify(fn)
callback(1222,(err,val)=>{
    console.log(err,val)
})

剖析callbackify

const callbackify = (fn) => {
    return (...args) => {
        let callback = args.pop()
        fn(...args).then(res => {
            callback(null, res)
        }).catch(err => {
            callback(err)
        })
    }
}

这个比较简单,因为考虑多个参数的情况,但是回调函数肯定在最后一个,所以使用pop把他取出来。

util.format

  • %s: String 将用于转换除 BigIntObject-0 之外的所有值。 BigInt 值将用 n 表示,没有用户定义的 toString 函数的对象使用具有选项 { depth: 0, colors: false, compact: 3 }util.inspect() 进行检查。
  • %d: Number 将用于转换除 BigIntSymbol 之外的所有值。
  • %i: parseInt(value, 10) 用于除 BigIntSymbol 之外的所有值。
  • %f: parseFloat(value) 用于除 Symbol 之外的所有值。
  • %j: JSON。 如果参数包含循环引用,则替换为字符串 '[Circular]'
  • %o: Object. 具有通用 JavaScript 对象格式的对象的字符串表示形式。 类似于具有选项 { showHidden: true, showProxy: true }util.inspect()。 这将显示完整的对象,包括不可枚举的属性和代理。
  • %O: Object. 具有通用 JavaScript 对象格式的对象的字符串表示形式。 类似于没有选项的 util.inspect()。 这将显示完整的对象,但不包括不可枚举的属性和代理。
  • %c: CSS. 此说明符被忽略,将跳过任何传入的 CSS。
  • %%: 单个百分号 ('%')。 这不消费参数。

语法 跟 C 语言的 printf 一样的

util.format(format, [args])

例子 格式化一个字符串

util.format('%s-----%s %s/%s','foo','bar','xm','zs')
//foo-----bar xm/zs  可以返回指定的格式

如果不传入格式化参数 就按空格分开

util.format(1,2,3)
//1 2 3
目录
相关文章
|
6天前
|
人工智能 前端开发 Java
基于java和uniapp的即时聊天源码
基于java和uniapp的即时聊天源码
32 1
|
6天前
|
安全 Java 开发工具
《Java 简易速速上手小册》第9章:Java 开发工具和框架 (2024 最新版)
《Java 简易速速上手小册》第9章:Java 开发工具和框架 (2024 最新版)
23 0
|
6天前
|
Java Maven 开发工具
《Java 简易速速上手小册》第5章:Java 开发工具和框架(2024 最新版)
《Java 简易速速上手小册》第5章:Java 开发工具和框架(2024 最新版)
35 1
|
6天前
|
JavaScript 安全 Java
不要再封装各种Util工具类了,这个神级框架值得拥有
不要再封装各种Util工具类了,这个神级框架值得拥有
18 1
|
6天前
|
数据采集 JavaScript 前端开发
使用HtmlUnit库的Java下载器:下载TikTok视频
使用Java和HtmlUnit构建TikTok视频下载器,模拟浏览器行为,绕过访问限制。通过爬虫代理配置代理服务器,隐藏真实IP,多线程技术提升下载效率。示例代码展示如何设置HtmlUnit,创建代理,启用JavaScript,下载并处理视频链接。学习了页面模拟、JavaScript交互、代理使用及多线程技术,为实际爬虫项目提供参考。
使用HtmlUnit库的Java下载器:下载TikTok视频
|
11月前
|
Java 应用服务中间件 Apache
开发|JavaWeb应用开发(一)——环境搭建
开发|JavaWeb应用开发(一)——环境搭建
74 0
|
Java 索引
【安利Java零基础】java基础语法—20道常见异常库(二)
【安利Java零基础】java基础语法—20道常见异常库
123 0
【安利Java零基础】java基础语法—20道常见异常库(二)
|
安全 Java
【安利Java零基础】java基础语法—20道常见异常库(一)
【安利Java零基础】java基础语法—20道常见异常库
100 0
【安利Java零基础】java基础语法—20道常见异常库(一)
|
Java 程序员 编译器
一文速学-Python联通调用JAVA的桥梁PyJnius库详解
一文速学-Python联通调用JAVA的桥梁PyJnius库详解
393 0
一文速学-Python联通调用JAVA的桥梁PyJnius库详解
|
数据采集 SQL XML
推荐一个智能的 Java 爬虫框架!用起来太爽了!
新一代爬虫平台,以图形化方式定义爬虫流程,不写代码即可完成爬虫。平台以流程图的方式定义爬虫,是一个高度灵活可配置的爬虫平台。
推荐一个智能的 Java 爬虫框架!用起来太爽了!