1.例子:
var a=2;
let promise=new Promise(function(resolve,reject){
if(a==1){
console.log(111);
resolve();
}else{
console.log(222);
reject();
}
})
promise.then(function(){
console.log('成功')
},function(){
console.log('失败')
})
console.log('Hi!');
备注:上述代码中,Promise新建后立即执行,所以首先输出的是222,然后,then方法制定的回调函数,将在当前所有同步任务执行完才会执行,所以‘失败’最后才输出
//惊讶的发现promise只能穿一个参数,多个参数只能考虑对象了
2.例子:
function timeout(ms) {
return new Promise((resolve, reject) => {
setTimeout(resolve, ms,'hello','world');
});
}
timeout(100).then((a,b) => {
console.log(a+b);
});
//另外setTimeout的(function,时间,参数1,参数2,参数3)
3.Promise.prototype.then()
Promise的实例里面有then方法,then方法是定义在原型对象Promise.prototype上的。它的作用是为Promise实例状态改变时的回调函数。then方法的第一个参数时resolved状态的回调函数,第二个参数(可选)是rejected状态的回调函数
例子:
var a=1;
const promise1=new Promise((resolve,reject)=>{
if(a==1){
console.log('resolve')
resolve();
}else{
console.log('reject')
reject();
}
})
promise1.then(function(){
console.log('成功');
},function(){
console.log('失败');
}).then(function(){
console.log('试试不是promise实例,第二个then会不会执行')
})
如果第一个then方法返回的是一个新的Promise实例(注意,不是原来那个Promise实例).因此可以采用链式写法,即then方法后看再调用另一个then方法
采用链式的then,可以指定一组按照次序调用的回调函数。这是,前一个回调函数,有可能返回的还是一个Promise对象(即有异步操作),这时后一个回调函数,就会等待该Promise对象的状态发生变化,才会被调用
4.Promise.prototype.catch()
Promise.prototype.catch方法是.then(null,rejection)的别名,用于指定发生错误的回调函数
就是then的第二个参数,变成单独的一个方法。
无论是回调函数报错还是仅仅是Promise对象的状态变成rejected,就会调用catch方法,或者这个错误被catch捕获
例子:
var promise=new Promise((resolve,reject)=>{
try{
console.log(11);
throw new Error('错了错了')
}catch(e){
reject(e)
}
})
promise.then(function(){
console.log('成功')
}).catch(function(e){
console.log(e)
})
//注:throw new Error可以手动抛出一个错误
一般的说,建议总是使用catch方法,而不使用then方法的第二个参数
如果没有用catch方法的话,Promise内部的错误不会影响Promise外部的代码,通俗的说法就是‘Promise会吃掉错误’
5.Promise.prototype.finally()
Finally方法用于指定不管Promise对象最后状态如何,都会执行的操作。不管promise最后的状态,在执行完then或者catch指定的回调函数以后,都会执行finally方法指定的回调函数
//finally不接受任何参数,所以就不知道promise的状态,都会执行这个回调函数
例子:
var promise=new Promise((resolve,reject)=>{
try{
console.log(11);
resolve();
console.log(111)
throw new Error('错了错了')
}catch(e){
reject(e)
}
})
promise.then(function(){
console.log('成功')
}).catch(function(e){
console.log(e)
}).finally(function(){
console.log('我是finally')
})
6.Promise.all()
Promise.all方法用于将多个Promise 实例,包装成一个新的Promise实例
到里面的所有参数实例的状态都到了resolve,才会到then的第一个函数
例子:
const promises=[2,3,4,5].map(function(id){
return new Promise((resolve,reject)=>{
console.log(id);
resolve();
})
})
Promise.all(promises).then(function(){
console.log('hello')
})
console.log(promises);
7.Promise.race()
Promise.race()方法也是用于将多个Promise 实例,包装成一个新的Promise实例
例子:
const p = Promise.race([p1, p2, p3]);
但是不同的是,上述代码中,只要p1,p2,p3之中有一个实例率先改变状态,p的状态就跟着改变,那个率先改变的Promise实例的返回值,就传递给p的回调函数
8.Promise.resolve()
有时需要将现有对象转为 Promise 对象,Promise.resolve方法就起到这个作用。
9.Promise.reject()
Promise.reject(reason)方法也会返回一个新的Promise实例,该实例的状态为rejected
//就是这个实例的执行结果都是吧状态变成rejected