// Promise基本用法
let pro1 = new Promise(function (resole, reject) { })
// Promise对象是全局对象.其中有两个参数:resolve(解决)和reject(拒绝),两个函数均为方法。resolve方法用于处理异步操作成功后业务;reject方法用于操作异步操作失败后的业务。
// (3)、Promise的三种状态.状态只能从 初始化 -> 成功 或者 初始化 -> 失败,不能逆向转换,也不能在成功fulfilled 和失败rejected之间转换。
// 1.pending:刚刚创建一个Promise实例的时候,表示初始状态;
// 2.fulfilled:resolve方法调用的时候,表示操作成功;
// 3.rejected:reject方法调用的时候,表示操作失败;
let pro = new Promise(function (resolve, reject) {
//实例化后状态:pending
if ('操作成功') {
resolve();//resolve方法调用,状态为:fulfilled
} else {
reject();//reject方法调用,状态为:rejected
}
});
//初始化实例后,对象的状态就变成了pending;当resolve方法被调用的时候,状态就变成了:成功fulfilled;当reject方法被调用的时候,状态就会有pending变成失败rejected。
// then()方法:用于绑定处理操作后的处理程序。参数是两个函数,第一个用于处理操作成功后的业务,第二个用于处理操作异常后的业务。
pro.then(function (res) {
//chonggong后执行
}, function (error) {
//shibai后执行
})
// 对于操作异常的程序,Promise专门提供了一个实例方法来处理:catch ( )方法。
pro.catch(function (error) {
//shibai后执行
})//catch只接受一个参数,用于处理操作异常后的业务。
// 大神写法
pro.then(function (res) {
//chonggong后执行
}).catch(function (error) {
//shibai后执行
})
// 案例
let pro2 = new Promise(function (resolve, reject) {
if (true) {
resolve('成功')
} else {
reject('shibai')
}
})
pro2.then(requestA).then(requestB).then(requestC).catch(requestError)
function requestA() {
console.log('请求A成功');//请求A成功
return '请求B,下一个就是你了';
}
function requestB(res) {
console.log('上一步的结果:' + res);//上一步的结果:请求B,下一个就是你了
console.log('请求B成功');//请求B成功
return '请求C,下一个就是你了';
}
function requestC(res) {
console.log('上一步的结果:' + res);//上一步的结果:请求C,下一个就是你了
console.log('请求C成功');//请求C成功
}
function requestError() {
console.log('请求失败');
}
// Promise.all()方法:接受一个数组作为参数,数组的元素是Promise实例对象,当参数中的实例对象的状态都为fulfilled时,Promise.all()才会有返回。
let pro3 = new Promise(function (resolve) {
setTimeout(function () {
resolve('实例1操作成功');
}, 5000);
});
let pro4 = new Promise(function (resolve) {
setTimeout(function () {
resolve('实例2操作成功');
}, 1000);
});
Promise.all([pro3, pro4]).then(function (result) {
console.log(result);//(2) ['实例1操作成功', '实例2操作成功']
});
// Promise.race()方法:它的参数要求跟Promise.all()方法一样,不同的是,它参数中的promise实例,只要有一个状态发生变化(不管是成功fulfilled还是异常rejected),它就会有返回,其他实例中再发生变化,它也不管了。
let pro5 = new Promise(function (resolve) {
setTimeout(function () {
resolve('实例1操作成功');
}, 4000);
});
//初始化实例pro2
let pro6 = new Promise(function (resolve, reject) {
setTimeout(function () {
reject('实例2操作失败');
}, 2000);
});
Promise.race([pro5, pro6]).then(function (result) {
console.log(result);
}).catch(function (error) {
console.log(error);//实例2操作失败
});