From a9d941ccfbb5b28933375017a3b5e573f0d72533 Mon Sep 17 00:00:00 2001 From: qianguyihao Date: Sat, 24 Jun 2023 11:21:25 +0800 Subject: [PATCH] add: util.promisify() --- .../01-单线程和异步任务.md | 8 ++--- .../06-Promise入门详解.md | 29 ++++++++++++++++--- 2 files changed, 29 insertions(+), 8 deletions(-) diff --git a/06-JavaScript基础:异步编程/01-单线程和异步任务.md b/06-JavaScript基础:异步编程/01-单线程和异步任务.md index 61181bf..e9e3511 100644 --- a/06-JavaScript基础:异步编程/01-单线程和异步任务.md +++ b/06-JavaScript基础:异步编程/01-单线程和异步任务.md @@ -40,11 +40,11 @@ JS代码在执行时有它的运行环境(也称之为“容器”),这个 ### 定义 -如果当前正在执行的任务执行完成前,它就会**阻塞**其他正在排队的任务。为了解决这个问题,JS 在设计之初,将任务分成了两类:同步任务、异步任务。 +当前正在执行的任务,如果没有执行完成,它可能会**阻塞**其他正在排队的任务。为了解决这个问题,JS 在设计之初,将任务分成了两类:同步任务、异步任务。 -- 同步任务:在**主线程**上排队执行的任务。只有前一个任务执行完毕,才能执行下一个任务。 +- 同步任务:在**主线程**上排队执行的任务。只有当前任务执行完毕,才能执行下一个任务。当前任务在没有得到结果之前,不会继续后续操作。 -- 异步任务:不进入主线程、而是进入**任务队列**(Event Queue)的任务,该任务不会阻塞后面的任务执行。只有"任务队列"通知主线程,某个异步任务可以执行了,该任务才会进入主线程执行。 +- 异步任务:不进入主线程、而是进入**任务队列**(Event Queue)的任务,该任务无论有没有得到结果,都不会阻塞后续任务的执行。只有"任务队列"通知主线程,某个异步任务可以执行了,该任务才会进入主线程执行。 代码举例: @@ -78,7 +78,7 @@ console.log('同步任务2'); - 2、回调函数: - 2.1、定时器:setTimeout(定时炸弹)、setInterval(循环执行) - 2.2、ajax请求。 - - 2.3、Node.js 中的一些方法回调。 + - 2.3、Node.js:FS文件读写、数据库操作。 - 3、ES6 中的 Promise、Generator、async/await 现在的大部分软件项目,都是前后端分离的。后端生成接口,前端请求接口。前端发送 ajax 请求,向后端请求数据,然后**等待一段时间**后,才能拿到数据。这个请求过程就是异步任务。 diff --git a/06-JavaScript基础:异步编程/06-Promise入门详解.md b/06-JavaScript基础:异步编程/06-Promise入门详解.md index b38d599..169e7a3 100644 --- a/06-JavaScript基础:异步编程/06-Promise入门详解.md +++ b/06-JavaScript基础:异步编程/06-Promise入门详解.md @@ -13,15 +13,15 @@ title: 06-Promise入门详解 ## Promise 的介绍和优点(为什么需要 Promise?) -Promise 是异步编程的一种解决方案和规范。ES6将其写进了语言标准,统一了用法,原生提供了Promise对象。 +Promise 是异步编程的一种**新的解决方案和规范**。ES6将其写进了语言标准,统一了用法,原生提供了Promise对象。 Promise 对象, 可以**用同步的表现形式来书写异步代码**(也就是说,代码看起来是同步的,但本质上的运行过程是异步的)。使用 Promise 主要有以下优点: -- 1、可以很好地解决**回调地狱**的问题(避免了层层嵌套的回调函数)。 +- 1、可以很好地解决ES5中的**回调地狱**的问题(避免了层层嵌套的回调函数)。 - 2、统一规范、语法简洁、可读性和和可维护性强。 - 3、Promise 对象提供了简洁的 API,使得管理异步任务更方便、更灵活。 -从语法上讲,Promise 是一个对象,它可以获取异步操作的消息。 +从语法上讲,Promise 是一个构造函数。从功能上来说,Promise 对象用于封装一个异步操作,并获取其成功/ 失败的结果值。 从写法规范上讲,**Promise 本质上是处理异步任务的一种编写规范**,要求每个人都按照这种规范来写。异步任务成功了该怎么写、异步任务失败了该怎么写、成功或者失败之后怎么通知调用者,这些都有规定的写法。Promise 的目的就是要让每个使用ES6的人都遵守这种写法规范。 @@ -195,7 +195,7 @@ promise.then(onFulfilled).catch(onRejected); Promise是一个类,通过 `new Promise()` 进行**实例化**,构造出一个 Promise 实例对象。 -1、Promise 的构造函数中需要传入一个参数,这个参数是一个回调函数,常用于处理异步任务。这个函数有一个专有名词叫 **executor**(执行器),因为在 `new Promise()` 时,这个函数会**立即执行**。 +1、Promise 的构造函数中需要传入一个参数,这个参数是一个回调函数,常用于处理异步任务。这个回调函数有一个专有名词叫 **executor**(执行器),因为在 `new Promise()` 时,这个函数会**立即执行**。 可以在该回调函数中传入两个参数:resolve 和 reject。我们可以在适当的时机执行 resolve()、reject(),用于改变当前 Promise 实例的状态到**成功**或**失败**。 @@ -657,6 +657,27 @@ qianguyihao then {"name":"qianguyihao"} ``` +## Node.js 中的util.promisify()方法 + +Node.js 中有一个内置的方法 util.promisify(),它可以很方便地将 ES5回调函数写法的方法,转成Promise写法的方法。就不需要我们手动封装Promise了。 + +代码举例: + +```js +// 引入 util 模块 +const util = require('util'); +// 引入 fs 模块 +const fs = require('fs'); + +// 返回一个新的函数,这个函数是一个 Promise 对象 +const readFilePromise = util.promisify(fs.readFile); +readFilePromise('readme.txt').then(res => { + console.log('res:', res.toString()); +}); +``` + + + ## 小结