前端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基本流程:


浙公网安备 33010602011771号