一、基本用法
生成promise实例
const promise1 = function(){
return new Promise((resolve,reject)=>{
if('成功'){
resolve('成功结果')
}else{
reject('失败结果')
}
})
}
// promise返回一个新的promise可以用then链式调用
注意:resolve和reject都只接受一个参数
promise对象有两种变化状态,pending-resolved或pending-reject(promise状态变化后就固定了),resolve的作用是将promise从待定变为成功(pending-resolved),并在异步操作成功时调用,并将异步操作的结果作为参数传递出去;reject是在异步操作抛出错误时调用,并将错误信息作为参数传递出去
二、promise.then
Promise 实例具有then方法,也就是说,then方法是定义在原型对象Promise.prototype上的。promise异步操作返回一个全新的promise实例,可以链式调用then方法,promise实例生成以后,可以用then方法分别指定resolved状态和rejected状态的回调函数。
promise1.then(
(value)=>{console.log(vlue)}, //成功
(error)=>{console.log(error)} //失败
).then((value)=>{}) //value是上一个promise实例操作成功的结果
例
// 阮一峰promise例子
function timeout(ms) {
return new Promise((resolve) => {
setTimeout(resolve, ms, "done"); // done 是resolve的参数
});
}
timeout(2000)
.then((value) => {
console.log(value); //done
})
三、Promise.prototype.catch()
ES规定异步操作不能用try/catch捕获错误,promise在原型上定义了个catch方法,可以用来链式的捕获错误
Promise.prototype.catch()方法是.then(null, rejection)或.then(undefined, rejection)的别名,用于指定发生错误时的回调函数。
const promise3 = new Promise(() => {
throw new Error("test");
});
promise3
.then(() => {
console.log("hihihi"); // 不执行
})
.catch((error) => {
console.log(error);
});
// 一个promise执行后只有resolve和reject两种状态,状态一旦改变就不再变化
//所以成功的log不执行
promise对象的错误具有冒泡性质,发生的错误信息回向下传递,直到被下一个catch捕获
四、Promise.prototype.finally()
finally 方法用于指定不管 Promise 对象最后状态如何都会执行finally,finally不接受参数,finally与前面的执行状态无关,不依赖前面的执行结果
const promise4 = new Promise((resolve, reject) => {
console.log(x + 1);
});
promise4
.then(() => {
console.log("你好");
})
.catch((err) => {
console.log(err);
})
.finally(() => {
console.log("finally");
});
// finally
finally方法总是会返回原来的值。(前一个实例的结果)
五、Promise.all()
Promise.all()接受多个promise:p1,p2,p3,包装成一个新promise,只有当p1,p2,p3全部为fulfilled(成功),这个新的promise才会是fulfilled(成功)此时p1、p2、p3的返回值组成一个数组,传递给p的回调函数。,只要有一个为reject,这个新的promise就是reject
const p = Promise.all([p1, p2, p3]);
const promises = [2, 3, 5, 7, 11, 13].map(function (id) {
return getJSON('/post/' + id + ".json");
});
Promise.all(promises).then(function (posts) {
// ...
}).catch(function(reason){
// ...
});
Promise.all()方法接受一个数组作为参数,p1、p2、p3都是 Promise 实例,如果不是,就会先调用Promise.resolve方法,将参数转为 Promise 实例,再进一步处理。另外,Promise.all()方法的参数可以不是数组,但必须具有 Iterator 接口,且返回的每个成员都是 Promise 实例。
六、Promise.race()
Promise.race()方法同样是将多个 Promise 实例,包装成一个新的 Promise 实例。率先返回的promise的状态就是新promise的状态,最先改变的promise的返回值传给p的回调函数。
const p = Promise.race([p1, p2, p3]);
const promises = [2, 3, 5, 7, 11, 13].map(function (id) {
return getJSON('/post/' + id + ".json");
});
Promise.race(promises).then((posts) =>{}).catch((reason)=>{});
七、Promise.any()
Promise.any()方法也是接受一组promise作为参数,包装成一个新promise对象,只要有一个参数实例是成功状态,那新promise就是成功状态,参数实例全为rejected状态新promise才为rejected状态。(和Promise.all()类似于且和或的关系)
const p = Promise.any([p1, p2, p3]);
可以用此方法捕获错误
Promise.any(promises).then(
(first) => {
// Any of the promises was fulfilled.
},
(error) => {
// All of the promises were rejected.
}
);
网友评论