Promise(个人理解)

4 篇文章 0 订阅

描述:

VS Code版本:

版本: 1.63.2
提交: 899d46d82c4c95423fb7e10e68eba52050e30ba3
日期: 2021-12-15T09:40:02.816Z
Electron: 13.5.2
Chromium: 91.0.4472.164
Node.js: 14.16.0
V8: 9.1.269.39-electron.0
OS: Windows_NT x64 10.0.19043

node.js版本

C:\Users\dell>node -v
v14.15.0

出现问题

TypeError [ERR_INVALID_CALLBACK]: Callback must be a function. Received undefined

一、先看bug

代码如下(错误代码)

const fs = require('fs')
const p = new Promise(() => {
  fs.readFile('./他.txt'),
    (err, data) => {
      if (err) {
        console.log('文件读取失败')
        return
      }
      console.log(data)
    }
})

看出问题了么

效果图 

 二、Promise_理论

Promise是什么?

Promise是一个函数类型的参数

Promise是干什么的 为什么要用Promise

他的存在主要是为解决异步编程的问题 比如说文件的读取、ajax等

Promise怎么用?

Promise的创建跟Java中创建类相同 使用new 关键字 然后可以复制 常量const 变量let 

使用Promise的好处

比如说在一块代码块中 我有很多判断 就是成功我要做什么 失败我要做什么 而且不止一个这样的判断 那么在我写完这段代码之后 回头看 即使是有代码美化器、格式化 依然比较"难看" 为什么 因为太多重复冗余的代码了 除去效率、性能因素、代码可读性太差 而Promise完美的解决了这个问题

Promise对象有三个状态,初始化状态、成功状态、失败状态。

new Promise创建即为初始化状态

//resolve :函数类型的参数 可以将Promise的状态设置为成功

//reject :函数类型的参数 可以将Promise状态设置为失败

而成功、失败状态分别是以两个参数的形式存在在Promise的箭头函数中即

let p = new Promise( (resolve ,reject ) => {})

三、Promise_实战

然后就可以将我们的代码写在箭头函数的方法体中 举例 读取磁盘文件中一个.txt的文件 要求实现成功读取文件并输出 失败打印失败日志

所以在整个代码块中可以分为两大部分读取文件、对文件读取状态进行判断就非常清晰 代码可读性很好

思路:

一、读取文件

1. 首选获取一个文件扩展对象 (引入node.js中的本地文件扩展模块)require('fs')
2. 然后创建一个Promise对象new Promise 并设置状态
3. 然后调用本地文件 将本地文件读取出来.readFile

.readFile有两个参数:
  //第一个参数:读取文件的路径
  //第二个参数:读取过程中第响应结果的处理

4.(在箭头函数的方法体中)对文件做出设置成功、失败状态

二、对文件读取状态进行判断

//p.then 当Promise的状态为成功时 then被自动调用

//p.catch 当Promise的状态为失败时 catch被自动调用

// 一、读取文件
// 1.引入node.js中的本地文件扩展模块
let fs = require('fs') 

// 2. 然后创建一个Promise对象new Promise 并设置状态
let p = new Promise((resolve, reject) => {

// 3. 然后调用本地文件 将本地文件读取出来.readFile
  fs.readFile('./他1.txt', (err, data) => {

    // 4.(在箭头函数的方法体中)对文件做出设置成功、失败状态
    if (err) {
      // console.log('文件读取失败')
      // return
      reject(err)
    }
    //当文件读取成功时的文件内容
    // console.log(data.toString())
    resolve(data)
  })
})

// 二、对文件读取状态进行判断

p.then((res) => {
  console.log(res.toString())
}).catch((error) => {
  console.log('出错了')
  console.log(error)
})

总结:借助于Promise,可以使异步操作中的成功和失败的处理函数独立出来。

运行失败效果图

 运行成功效果图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

妙趣生花

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值