简单聊聊Promise

Promise

它是一个ES6提出一个新语法,用来优化异步代码的写法
在ES6中,它是新增的构造器(Array, Object, Promise),用来优化实现异步操作。在没有它之前,javascript中的异步处理,大多是利用回调函数来实现的。典型的几种如下:(1)setTimeout (2)ajax 现在有了promise,就可以对这些异步操作进行改写了

先说说定义

简单来说—Promise是个对象,毕竟万物皆对象,翻译一下也是承诺,啥是承诺,就是你承诺将来会执行的事情.比如路飞承诺自己会当上海贼王.

当然这个承诺可能会成功,所以路飞当上了海贼王–执行.then(‘路飞是海贼王’):

也有可能失败,路飞没当上海贼王回去继承他爹的革命军–执行.catch(‘路飞是革命军’)
在这里插入图片描述

then方法返回的是一个新的Promise实例(!!注意–这不是原来的Promise实例).因此可以采用链式写法,
就是then方法后面可以继续调用另一个then方法

catch方法是Promise只要发生错误就会被catch方法捕获到

经典格式

let p1 = new Promise((resolve, reject) => {

// resolve和reject是Promise内提供的2个函数, 用于回调返回结果到外面

resolve(成功结果) // 触发.then()小括号里函数体执行

reject(失败结果) // 触发.catch()小括号里函数体执行

})

p1.then((成功结果变量名) => {

}).catch((失败结果变量名) => {

}).finally(()=>{

// 一定会执行的代码

})
  • resolve函数的作用是,将Promise对象的状态从“未完成”变为“成功”,触发.then的执行
  • reject函数的作用是,将Promise对象的状态从“未完成”变为“失败”,触发.catch的执行

Promise的三种状态和值

三种状态

(pending: 准备; resolved(或者fulfilled) 成功; rejected: 失败

准备:new实例化后, Promise对象(pending准备状态)

成功:当Promise内代码执行了resolve, 会导致所在的Promise对象 变成 fulfilled成功状态

失败:当Promise内代码执行了reject, 会导致所在的Promise对象 变成 rejected失败状态

resolve(值),这个值会自动传递给then

reject(值),这个值会自动传递给catch

then方法

作用

then方法的作用是为Promise对象添加状态改变时的回调函数。

then有两个参数,两个参数都是函数,其中第二个参数是可写可不写的

  • 第一个参数是resolved状态的回调函数。当p的状态从pending变成了resolved,函数1会执行。
  • 第二个参数是rejected状态的回调函数。 当p的状态从pending变成了rejected,函数2会执行。
var p = new Promise((resolve,reject)=>{
                    //  resolve(val1);
    reject(val2)
})

p.then(
    okVal =>{
        console.info("成功");
    	console.log(okValue);
    }, 
	errVal=>{
    	console.info("失败");
    	console.log(errValue);
    }
)

它的两个参数都是函数,其执行逻辑是:

  • 如果promise对象的状态是resolved,则then()会执行第一个函数,并传入当前的PromiseValue(即上面的val1);
  • 如果promise对象的状态是rejected,则then()会执行第二个函数,并传入当前的PromiseValue(即上面的val2);
  • 特别地,如果promise对象的状态是rejected,且此时then方法并没有设置第二个参数,就会向外抛出一个错误,错误的提示大约是Uncaught (in promise)

Promise还有许多静态方法

比如Promise.arr( ) Promise.race() Promise.allSettled()等

Promise.arr( )

作用: 合并多个Promise对象, 等待所有成功后, 返回结果

语法: Promise.all([promise对象1, promise对象2, …]).then()

特点: 返回最终结果是个数组, 值是按顺序对应小Promise对象的成功结果

注意: 如果有1个Promise失败, 则整个Promise对象则失败

Promise.race()

作用: 发起并行多个Promise对象, 等待只要任何一个有结果(成功|失败), 返回结果执行then

语法: Promise.race([promise对象1, promise对象2, …]).then()

特点: 返回第一个有结果的promise对象的结果(谁返回的速度快看谁)

Promise.allSettled()

Promise.allSettled([p1, p2,p3]) 和 Promise.all([p1, p2,p3])

如果p1,p2,p3都Ok, 他们的结果是一样的

如果p1,p2,p3有一个不成功,例如p1不成功,他们的结果是不一样的

Promise.all([p1, p2,p3]) ===> 失败的promise,值就p1的值

Promise.allSettled([p1, p2,p3])===> [p1的结果,p2的结果,p3的结果]

这是本人第一次写文章,说的比较粗略,请大家多多包涵!欢迎大家指正其中可能存在的错误和问题
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值