一.什么是promise?
要认识promise这个工具的话,我们可以从抽象意义上和具体意义上对他进行表述。
(1)抽象表达
1.promise是一门新的技术(es6规范)。
2.promise是JS中异步编程的新解决方案,旧方案是调用回调函数。
(2)具体表达
1.从语法上来说,promise是一个构造函数。
2.从功能上来说,promise对象用来封装一个异步操作并可以成功/失败的结果。
二.为什么要用promise,他有什么优缺点吗?
要分析promise这个工具的话,我们就要从他的优缺点角度出发。
(1)优点
1.相比于传统的回调函数,promise更加灵活,不局限于异步任务开始前指定。
2.可以进行链式调用,解决回调地狱的问题。
(2)缺点
1.不能从根本上解决回调地狱的问题。
2.链式调用过长会影响代码可读性,维护性低。
3.如果没添加.catch方法有可能无法捕获异常,导致程序崩溃。
三.promise状态改变特征(promisestate)
(1)promise有哪些状态
promise一共有padding(等待状态),resolved(成功状态),rejected(失败状态).
(2)promise状态改变特征
1.padding->resolved
2.padding->rejected
3.不能直接从resolved->rejected,并且每个promise对象只能改变一次,改变后会传输一个结果数据成功为value,失败为reason
四.promise结果属性(promiseResult)
两种状态:fulfilled(表示成功),rejected(表示失败)
五.promise语法格式
new Promise(function (resolve, reject) {
// resolve 表示成功的回调
// reject 表示失败的回调
}).then(function (res) {
// 成功的函数
}).catch(function (err) {
// 失败的函数
})
其中我们就可以发现function中的两个参数resolve和reject,其中这两个参数也是两个函数,很好理解,resolve函数存在的意义就是将promise对象状态转换成一个成功的状态,并将其结果作为参数传递出去,而reject则是将promise对象状态转换成一个失败的状态,将其结果传递出去
在promise实例生成之后通过.then来去调用
resolved状态
和rejected状态
的回调函数。
六.promise的四种常见方法
(1)promise.resolve()
let p1=Promise.resolve(234)
console.log(p1);
//如果传入的参数为非promise类型的对象,则返回结果为成功的promise类型对象
//如果掺入的参数为promise类型对象,则返回结果由参数结果决定
let p2=Promise.resolve(new promise((resolve,reject)=>{
resolve('ok');
}))
console.log(p2);
promise.resolve()方法是返回一个成功/失败的结果
分析上述代码,对象p1中传入的参数为234,他是非promise类型对象,所以返回结果应该是成功promise类型对象,即promisestate为fulfilled,而p2中传入的参数为promise类型对象,分析其参数结果应该是成功,所以返回结果也是成功,即promisestate也为fulfilled。
运行结果如下:
(2)promise.reject()
let p1 = Promise.reject(521);
console.log(p1);
let p2 = Promise.reject(new Promise((resolve, reject) => {
resolve('ok');
}))
console.log(p2);
promise.reject()方法返回一个失败的promise类型对象
不管promise.reject()中的参数是以何种形式的对象,他都会返回一个失败的promise类型对象
运行结果如下
(3)promise.all()
let p1=new Promise((resolve, reject)=>{
resolve('ok');
});
let p2=Promise.resolve('om');
let p3=Promise.resolve('oo');
const result=Promise.all([p1,p2,p3]);
console.log(result);
包含n个promise的数组
返回一个新的promise,只有当所有的promise成功才成功只要有一个失败了就直接失败
运行结果如下
(4)promise.race()
let p1 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve('ok');
}, 1000);
});
let p2 = Promise.resolve('om');
let p3 = Promise.resolve('oo');
const result = Promise.race([p1, p2, p3]);
console.log(result);
包含n个promise的数组
返回一个新的promise,第一个promise的结果就是最终的结果状态
运行结果如下
promise.race和promise.all的区别?
promise.all:只有所有的promise成功才能成功,只要有一个失败就失败
promise.race:返回第一个新的promise,第一个完成的promise为最终结果
小结
不论是在前端的项目开发中还是在前端的面试过程中,Promise的地位就是举足轻重的,所以,学好promise是成为一个优秀的前端工程开发师的必要技能,所以,干就完了,奥利给!!!
😃😃