Promise是异步编程的一种解决方案,是一个对象,可以获取异步操作的消息,大大改善了异步编程的困难,避免了回调地狱,比传统的解决方案回调函数和事件更合理和更强大。
从语法上讲,Promise是一个对象,它可以获取异步操作的消息。提供了一个统一的API,各种异步操作都可以用同样的方法进行处理
1、Promise的实例有三个状态:
(1)Pending(进行中)
(2)Resolved(已完成)
(3)Rejected (已拒绝)
2、Promise的实例有两个过程
(1)pending > fulfiled :Resolved
(2)pending > rejected :Rejected
注意:一旦从进销项状态变为其他状态就永远不能更改状态了
Promise的基本用法:
1、创建Promise对象
Promise 对象代表一个异步操作,有三种状态:pending(进行中)、fulfilled(已成功)、rejected(已失败)
Promise构造函数接收一个函数作为参数,该函数的两个参数分别是 resolve 和 reject
2、Promise 方法
Promise有五个常用方法:
(1)then()
then 方法可以接收两个回调函数作为参数,第一个回调函数是Promise对象的状态改变为 resoved 是调用,第二个回调函数是 Promise 对象的状态变为 rejected 时调用。其中第二个参数可以省略。
- let promise = new Promise((resolve,reject)=>{
- ajax('first').success(function(res){
- resolve(res);
- })
- })
- promise.then(res=>{
- return new Promise((resovle,reject)=>{
- ajax('second').success(function(res){
- resolve(res)
- })
- })
- }).then(res=>{
- return new Promise((resovle,reject)=>{
- ajax('second').success(function(res){
- resolve(res)
- })
- })
- }).then(res=>{
- })
(2)catch()
该方法相当于 then 方法的第二个参数,指向 reject 的回调函数。
另一个作用是,在执行resolve回调函数时,如果出错,抛出异常,不会停止陨星,而是进入catch 方法中。
- p.then((data) => {
- console.log('resolved',data);
- },(err) => {
- console.log('rejected',err);
- }
- );
- p.then((data) => {
- console.log('resolved',data);
- }).catch((err) => {
- console.log('rejected',err);
- });
(3)all()
all 方法可以完成并进行任务,它接收的是一个数组,数组的每一项都是 Promise 对象。当数组中所有的 Promise 状态都达到 resolved 的时候,all 方法的状态就会变成 resolved,如果有一个状态变成了 rejected。那么all 方法的状态就会变成rejected。
- javascript
- let promise1 = new Promise((resolve,reject)=>{
- setTimeout(()=>{
- resolve(1);
- },2000)
- });
- let promise2 = new Promise((resolve,reject)=>{
- setTimeout(()=>{
- resolve(2);
- },1000)
- });
- let promise3 = new Promise((resolve,reject)=>{
- setTimeout(()=>{
- resolve(3);
- },3000)
- });
- Promise.all([promise1,promise2,promise3]).then(res=>{
- console.log(res);
- //结果为:[1,2,3]
- })
(4)rece()
rece 方法和 all 一样,接收的参数是一个每项都是 Promise 的数组,但是与 all 不同的是,当最先执行完的事件执行完之后,就直接返回该 promise 对象的值
rece的实际作用:当要做一件事,超过长时间就不做了,可以用这个方法来解决。
- Promise.race([promise1,timeOutPromise(5000)]).then(res=>{})
(5)finally()
finally 方法用于指定不管 Promise 对象最后状态如何,都会执行的操作。(该方法是ES2018中引入标准的)
- promise
- .then(result => {···})
- .catch(error => {···})
- .finally(() => {···});
finally 方法的回调函数不接受任何参数,这意味着没有办法知道前面的 Promise 状态到底是 fulfilled 还是 rejected
- promise
- .finally(() => {
- // 语句
- });
- // 等同于
- promise
- .then(
- result => {
- // 语句
- return result;
- },
- error => {
- // 语句
- throw error;
- }
- );
在上面代码中,如果不写 finally 方法,同样的语句需要为成功和失败两种情况各写一次。有了 finally 方法只需写一次即可
总结
本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注w3xue的更多内容!