promise
目的:1、是为了解决异步编程中回调地狱的问题 2、将异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数
3、Promise 对象提供统一的接口,使得控制异步操作更加容易。
使用:1、Promise对象是一个构造函数,可以使用 new 来调用 Promise 的构造器来进行实例化来生成Promise实例,
2、Promise 构造函数包含一个参数和一个带有 resolve(解析)和 reject(拒绝)两个参数的回调。在回调中执行一些操作(例如异步),如果一切都正常,则调用 resolve,否则调用 reject。
let promise = new Promise((resolve,reject)=>()})
3、可以调用 promise.then() 方法,then方法可以接受两个回调函数作为参数
成功,就会执行then方法的第一个回调函数 失败,就会执行then方法的第二个回调函数
const fs = require('fs')
// 封装读取文件内容的promise函数
function hmReadFile (filename) {
return new Promise((resolve, reject) => {
fs.readFile(filename, 'utf-8', (err, data) => {
if (err) {
reject(err)
} else {
resolve(data)
}
})
})
}
// 调用promise函数
hmReadFile('./1.txt')
.then(data => {
console.log('1.txt: ' + data)
})
.catch(err => {
console.log(err)
})
promise原理:
1、所谓Promise,简单说就是一个容器,里面异步操作的结果
2、Promise对象的状态不受外界影响,只受异步操作的结果影响
3、Promise对象有三种状态:pending(进行中)、fulfilled(已成功)和rejected(已失败)
3、Promise对象的状态改变(一旦改变,状态不可逆),只有两种可能:
(1)从pending(进行中)变为fulfilled(已成功) (2)从pending(进行中)变为rejected(已失败)
promise特点:
1、promise创建就会执行他里面的代码
2、把创建promise实例的代码做了一个封装,好处就是只有在调用这个方法的时候才会去执行promise里面的代码,而且要创建多个promise实例的时候比较简洁
// 封装原生ajax请求的promise函数
function ajaxText(url) {
return new Promise((resolve, reject) => {
const xhr = new XMLHttpRequest();
xhr.open("get", url);
xhr.onload = () => {
if (xhr.status == 200) {
resolve(xhr.responseText);
} else {
reject(xhr.responseText);
}
};
xhr.send();
});
}
// 调用promise函数
ajaxText("https://autumnfish.cn/api/joke")
.then((data) => {
console.log("data:" + data);
})
.catch((err) => {
console.log("err:" + err);
});
function jqAjax({url, type, data}){
return new Promise((resolve, reject) => {
$.ajax({
url,
type,
data,
success: (backData)=>{
resolve(backData);
},
error: () => {
reject('请求失败');
}
});
});
}
jqAjax({url:'https://autumnfish.cn/api/joke/list', type:'get', data:{num:4}}).then(backData=>{
console.log(backData);
});
promise的方法:
1、catch(),抓取错误的
2、静态方法Promse.all()在处理多个异步处理时非常有用,比如说一个页面上需要等两个或多个ajax的数据回来以后才正常显示,在此之前只显示loading图标。
3、静态方法Promise.race() ,Promse.race就是赛跑的意思,意思就是说,Promise.race([p1, p2, p3])里面哪个结果获得的快,就返回那个结果,不管结果本身是成功状态还是失败状态