Promise是一个类,可以创建一个实例, Promise,也是一个对象,用来传递异步操作的消息。
Promise有三个状态:
penging(对象的初始状态,等到任务的完成或者被拒绝)
fulfilled (任务执行完成并且成功的状态)
rejuce(任务执行完成并且失败的状态)
Promise对象有以下两个特点:
1)对象的状态不受外界影响。
2) 一旦状态改变,就不会再变, Promise的状态只可能从“pending”状态转到“fulfilled”状态或者“pejected”状态,而且不能逆向转换.
缺点:
无法取消 Promise,一旦新建它就会立即执行,无法中途取消。
如果不设置回调函数,Promise 内部抛出的错误,不会反应到外部。
Promise的用法
Promise的构造函数接收一个参数,是函数,并且传入两个参数:resolve,reject,分别表示异步操作执行成功后的回调函数和异步操作执行失败后的回调函数。
var promise = new Promise(function(resolve, reject) {
if (/* 异步操作成功 */){
resolve(value);
} else {
reject(error);
}
});
//then里面的函数就跟我们平时的回调函数,不管上面的是什么结果,都会走then里面。//then可以很多次
promise .then(function (value){
console.log('成功',value);
},function(reason){
console.log('失败',reason);
})
Promise还提供了all,race、reject、resolve等方法
promise链式调用:会将前一个then的返回值(return)作为下一次成功的回调函数的参数。
promise.all方法:可以传入多个promise ,全部执行后将结果以数组的方式返回,如果有一个失败了,就失败了
promise.race方法:就是赛跑的意思。race的用法与all一样,谁的时间快就实行哪个函数
下面就是的小例子(字符串的倒叙),来讲解promise.all方法和promise.race方法
let p1 =new Promise(function (resolve,reject) {
let str1 ='123456789'; //定义一个字符串
let leg = str1.length; //获取字符串的长度
let re =''; //存储返回值
let i =1; //初始循环变量
let a = setInterval(function () { //定义一个定时器
re+= str1.charAt(leg-i); //获取字符串指定的位置的字符
i++;
if(i > leg) { //判断循环变量大于指定字符串长度
clearInterval(a); //结束定时器
if (i == leg +1) { //判断循环变量 刚好大于指定字符长度时 返回 倒叙字符串
resolve(re);
}else {
reject('倒叙失败!');
}
}
},100);
});
let p2 =new Promise(function (resolve,reject) {
let str1 ='abcdefghijklmn';//定义一个字符串
let leg = str1.length;//获取字符串的长度
let re ='';//存储返回值
let i =1;//初始循环变量
let a1 = setInterval(function () {//定义一个定时器
re+= str1.charAt(leg-i);//获取字符串指定的位置的字符
i++;
if(i > leg){//判断循环变量大于指定字符串长度
clearInterval(a1);//结束定时器
if(i == leg+1){//判断循环变量 刚好大于指定字符长度时 返回 倒叙字符串
resolve(re);
}else {
reject('倒叙失败2!');
}
}
},100);
});
Promise.all([p1,p2]).then(function (value) {
console.log(value);/
},function(reason){
console.log(reason);
})
Promise.race([p1,p2]).then(function (value) {
console.log(value);
},function(reason){
console.log(reason);
})
以上就是Promise的基本用法
扩展: