Promise 是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大。它由社区最早提出和实现,ES6 将其写进了语言标准,统一了用法,原生提供了Promise对象。
1、promise有三种状态,分别是reject(失败)、fulfilled(完成)、pending(正在进行时)。只有异步操作的结果,可以决定当前是哪一种状态,任何其他操作都无法改变这个状态。这也是Promise这个名字的由来,它的英语意思就是“承诺”,表示其他手段无法改变。
2、一旦状态改变,就不会再变,任何时候都可以得到这个结果。Promise对象的状态改变,只有两种可能:从pending变为fulfilled和从pending变为rejected。只要这两种情况发生,状态就凝固了,不会再变了,会一直保持这个结果,这时就称为 resolved(已定型)。如果改变已经发生了,你再对Promise对象添加回调函数,也会立即得到这个结果。这与事件(Event)完全不同,事件的特点是,如果你错过了它,再去监听,是得不到结果的。
注意,为了行文方便,本章后面的resolved统一只指fulfilled状态,不包含rejected状态。
3、promise对象是一个构造函数,用来生成promise实例
let p =new Promise(
(reslove,reject)=>{
// 同意===>成功
reslove();
// 拒绝===>失败
reject();
}
);
promise 实例具有then方法,也就是说,then方法是定义在原型对象
p.then(
()=>{
console.log("成功");
},
()=>{
console.log("失败");
}
)
4、promise的方法
Promise.all方法用于将多个 Promise 实例,包装成一个新的 Promise 实例。
Promise.all(
[
$.ajax({
url:'./1.txt'
}),
$.ajax({
url:'./2.txt'
}),
$.ajax({
url:'./3.txt'
}),
]).then(
(data)=>{
console.log(data)
}
)
5、promise小实例
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<script>
// class练习
// 学生的类 属性 性别 成绩 年龄
// 原型方法 成绩平均数
// 男女比例 精确到小数点后3位
class Student{
constructor(sex,grade){
this.sex=sex;
this.grade=grade;
// this.age=age;
}
fn(...arg){
// 接受到数据
console.log(arg);
// 这个方法有问题,遍历出来的item和val是对象
// let grade = arg[0].reduce(
// (item,val,index)=>{
// if (index<arg.length-1){
// return item+val;
// }else{
// // console.log(val);
// // console.log(item.grade+"."+val.grade);
// return (item+val)/arg[0].length;
// }
// }
// )
let grade=0;
// 进行遍历,对数据进行操作
arg[0].forEach(
element=>{
grade+=element.grade;
});
console.log(grade/arg[0].length);
}
}
// 生成数据
let arr=[];
for (let i=0;i<5;i++){
let tr=new Student(rand(0,1),rand(60,100));
arr.push(tr);
}
console.log(arr);
// 将数据放进原型方法中去
arr[0].fn(arr);
function rand(min,max){
return Math.floor(Math.random()*(max+1-min)+min);
}
</script>
</body>
</html>
网友评论