javaScript蓝桥杯------封装 Promisefy 函数


一、介绍

我们知道在浏览器中 JavaScript 是单线程运行的,而回调函数曾经是 JavaScript 中实现异步函数的主要方式,面对这样的嵌套回调,处理错误也会变得非常困难:你必须在“金字塔”的每一级处理错误,而不是在最高一级一次完成错误处理,所以大多数现代异步 API 采用的都是 Promise 的形式。

下面就请你以 Node.js 中常用的读取文件操作为例,封装一个 Promisefy 函数,将回调形式调用的读取文件方法转换成一个 Promise 的版本。

二、目标

请在 index.js 文件中的补全代码,完成 promisefy 函数的封装。将 fs 中的 readFile 方法 promise 化。也就是说 readFileSync 方法执行后,会返回一个 promise,可以调用 then 方法执行成功的回调或失败的回调。

在实际应用中,一个函数满足这几个条件,就可以被 promisify 化:

该方法必须包含回调函数

  • 回调函数必须执行
  • 回到函数第一个参数代表 err 信息,第二个参数代表成功返回的结果
    在控制台运行:
node index

此时应打印出 true,即:回调形式的 fs.readFile 方法读取同个文件的结果与 Promise 形式读取结果一致。

三、代码

js

const fs = require('fs')
const path = require('path')
const textPath = path.join(__dirname, '/test.md')

// 读取示例文件
fs.readFile(textPath, 'utf8', (err, contrast) => {
    
    
  // 通过promisefy转化为链式调用
  const readFileSync = promisefy(fs.readFile)

  readFileSync(textPath, 'utf8')
    .then((res) => {
    
    
      console.log(res === contrast) // 此处结果预期:true,即promise返回内容与前面读取内容一致
    })
    .catch((err) => {
    
    })
})

const promisefy = (fn) => {
    
    
  // TODO 此处完成该函数的封装


}

module.exports = promisefy // 请勿删除该行代码

md

这是一个示例文件

四、答案

1.做法一:自己写

const fs = require('fs')
const path = require('path')
const textPath = path.join(__dirname, '/test.md')

// 读取示例文件
fs.readFile(textPath, 'utf8', (err, contrast) => {
    
    
  // 通过promisefy转化为链式调用
  const readFileSync = promisefy(fs.readFile)
  readFileSync(textPath, 'utf8')
    .then((res) => {
    
    
      console.log(res === contrast) // 此处结果预期:true,即promise返回内容与前面读取内容一致
    })
    .catch((err) => {
    
    })
})

const promisefy = (fn) => {
    
    
  // TODO 此处完成该函数的封装
  //看到返回的readFileSync需要传入两个参数一个是textPath 一个是类型
  //那么就说明不需要处理err,data ,promise返回的结果就是这两个
  return (textPath, x) =>
    new Promise((resolve, reject) => {
    
    
      fn(textPath, x, (err, data) => {
    
    
        if (err) {
    
    
          reject(err)
        } else {
    
    
          resolve(data)
        }
      })
    })
}


module.exports = promisefy // 请勿删除该行代码

2.做法二:利用util的promisify

const fs = require('fs')
const path = require('path')
const util = require('util')
const textPath = path.join(__dirname, '/test.md')

// 读取示例文件
fs.readFile(textPath, 'utf8', (err, contrast) => {
    
    
  // 通过promisefy转化为链式调用
  const readFileSync = util.promisify(fs.readFile)

  readFileSync(textPath, 'utf8')
    .then((res) => {
    
    
      console.log(res === contrast) // 此处结果预期:true,即promise返回内容与前面读取内容一致
    })
    .catch((err) => {
    
    })
})



猜你喜欢

转载自blog.csdn.net/m0_58065010/article/details/129942471
今日推荐