Promise是什么?
理解
抽象表达
1)Promise是一门新的技术(ES6规范)
2)Promise是js中进行异步编程的新解决方案
备注:旧方案是单纯使用回调函数
具体表达:
1)从语法上来说:Promise是一个构造函数
2)从功能上来说:promise对象用来封装一个异步操作并可以获取其成功/失败的结果值
为什么要用Promise
指定回调函数的方式更加灵活
1)旧的:必须在启动异步任务前指定
2)promise:启动异步任务=》返回promise对象=》给promise对象绑定回调函数(甚至可以在异步任务结束后指定多个)
支持链式调用,可以解决回调地狱问题
1)什么是回调地狱?
回调函数嵌套调用,外部回调函数异步执行的结果是嵌套的回调执行的条件
2)回调地狱的缺点
不便于阅读
不便于异常处理
3)解决方案
promise链式调用
Promise-fs读取文件
const fs = require('fs')
// 回调函数形式
// fs.readFile('./content.txt',(err,data)=>{
// if(err) throw err
// console.log(data.toString())
// })
// Promise形式
let p = new Promise((resolve, reject) => {
fs.readFile('./content.txt', (err, data) => {
if (err) reject(err)
resolve(data)
})
})
p.then(value => {
console.log(value.toString())
}, reason => {
console.log(reason)
})
// 封装一个函数mineReadFile读取文件内容
function mineReadFile(path){
return new Promise((resolve,reject)=>{
require('fs').readFile(path,(err,data)=>{
if(err){
reject(err)
}else{
resolve(data)
}
})
})
}
mineReadFile('content.txt').then(value=>{
console.log(value.toString())
},reason=>{
console.log(reason)
})
Promise-ajax请求
// 接口地址 https://api.apiopen.top/getJoke
const btn = document.querySelector('#btn')
btn.addEventListener('click', function() {
const p = new Promise((resolve, reject) => {
// 创建对象
const xhr = new XMLHttpRequest
// 初始化
xhr.open('GET', 'https://api.apiopen.top/getJoke')
// 发送
xhr.send()
// 处理响应结果
xhr.onreadystatechange = function() {
if (xhr.readyState === 4) {
if (xhr.status >= 200 && xhr.status < 300) {
resolve(xhr.response)
} else {
reject(xhr.status)
}
}
}
})
p.then(value => {
console.log(value)
}, reason => {
console.log(reason)
})
})
/*
封装一个函数sendAJAX发送get ajax请求
参数 URL
返回结果Promise对象
*/
function sendAJAX(url){
return new Promise((resolve,reject)=>{
const xhr=new XMLHttpRequest
xhr.responseType='json'
xhr.open('get',url)
xhr.send()
xhr.onreadystatechange=function(){
if(xhr.readyState===4){
if(xhr.status>=200 && xhr.status<300){
resolve(xhr.response)
}else{
reject(xhr.status)
}
}
}
})
}
sendAJAX('https://api.apiopen.top/getJoke').then(value=>{
console.log(value);
},reason=>{
console.log(reason);
})
util.promisify方法
util.promisify方法将一个异步函数转换成一个Promise对象,并且返回一个新的函数。
参数:
fn:需要转换的函数。
thisArg:可选,指定this对象。
返回值:
返回一个新的函数,该函数的参数与fn函数的参数相同,并且返回一个Promise对象。
如果fn函数返回一个Promise对象,则返回的Promise对象的状态和fn函数返回的Promise对象的状态相同。
如果fn函数返回一个非Promise对象,则返回的Promise对象的状态为resolved,并且返回fn函数返回的非Promise对象。
如果fn函数抛出一个异常,则返回的Promise对象的状态为rejected,并且返回fn函数抛出的异常。
如果fn函数返回一个Promise对象,则返回的Promise对象的
// util.promisify方法
// 引入util模块
const util=require('util')
// 引入fs模块
const fs=require('fs')
// 返回一个新的函数
let miniReadFile=util.promisify(fs.readFile)
miniReadFile('content.txt').then(value=>{
console.log(value.toString());
})
promise的状态改变
实例对象中的一个属性,PromiseState
1.pending变为resolved / fulfilled 成功
2.pending变为rejected 失败
说明:只有这2种,且一个promise对象只能改变一次,无论变为成功还是失败,都会有一个结果数据,成功的结果数据一般称为value,失败的结果数据一般称为reason。
promise对象的值
实例对象中的另一个属性,PromiseResult,保存着异步任务 成功/失败 的结果。通过resolve和reject函数保存。