前端Promise-Day40

Promise:

Promise是ES6的新技术,用于处理异步编程。(旧方案使用回调函数)

从语法上来说,Promise是构造函数。从功能上来说,promise对象用来封装一个异步操作,且可以获取其成功和失败的结果值。

Promise的优点:

1.指定回调函数更加灵活

  • 旧版方法需要在启动异步任务前指定
  • promise:启动异步任务 => 返回promise对象 => 给promise对象绑定回调函数

2.支持链式调用,且可以解决回调地狱问题。

  • 回调地狱:回调函数嵌套使用,外部回调函数异步执行的结果是嵌套回调的执行条件。
  • 回调地狱的缺点:不利于阅读,不利于异常处理

 

Promise的参数分为:resolve和reject,均为函数类型数据,分别代表promise对象的状态。

对promise的实例化对象调用then方法,有两个参数均为函数类型数据,为成功的回调函数和失败的回调函数。

 then方法的回调函数可以通过promise中的resolve和reject传参并获取

 

 

 

promise对于回调函数的优化:

① fs文件模块:

// 回调函数形式
fs.readFile(('./1.txt'), (err, data) => {
    if (err) throw err
    console.log(data.toString());
})

// Promise形式
const p = new Promise((resolve, reject) => {
    fs.readFile('./12.txt', (err, data) => {
        if (err) reject(err)
        resolve(data)
    })
})
p.then(value => {
    console.log(value.toString());
}, reason => {
    throw reason
})

② AJAX请求:

const p = new Promise((resolve, reject) => {
const xhr = new XMLHttpRequest()
xhr.open('GET', 'http://127.0.0.1:7080/get')
xhr.send()
xhr.onreadystatechange = function () {
if (xhr.readyState === 4 && xhr.status === 200) {
    resolve(xhr.response)
} else {
    reject(xhr.status)
  }
}
}).then(value => {
    document.querySelector('input').value = value
, reason => {
     console.log(reason)
})

 

util.promisify方法实现promise风格转化:对回调函数进行封装,返回promise对象的新函数。

let mineReadFile = util.promisify(fs.readFile)
mineReadFile('./1.txt').then(value => console.log(value.toString()))

 

Promise对象状态属性:即Promise实例化对象的属性 PromiseState

分为三类:1. pending:未决定的    2.resolve/fullfilled:成功    3.reject:失败

状态改变方式:

① pedding变为resolve

② pedding变为reject

promise对象的状态只能改变一次,成功或失败只有一个结果,成功为value,失败为reason

 

Promise对象的值:即Promise实例化对象的属性 PromiseResult (保存着异步任务成功或失败的结果)

可以通过resolve和reject进行修改。

 

Promise基本流程:

 

posted @ 2022-09-30 12:07  HM-7  阅读(39)  评论(0)    收藏  举报