JavaScript Promise详解

JavaScript Promise详解

Promise是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大。
所谓Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。
通俗讲,Promise是一个许诺、承诺,是对未来事情的承诺,承诺不一定能完成,但是无论是否能完成都会有一个结果。

构造器

//构造器如下
let promise = new Promise(function(resolve, reject) {
 // 承诺内容
});

1.构造器中的参数会带有一个执行函数,此函数会自带两个参数:
resolve《解决承诺》 reject《拒绝承诺》
2.我们需要通过执行函数(生产者代码)来改变promise对象的状态(即获取承诺的结果,无论是否成功都会有结果)
3.当 承诺内容 获得了结果,无论是早还是晚都没关系,它应该调用以下回调之一:
resolve(value) —— 如果任务成功完成并带有结果 value。
reject(error) —— 如果出现了 error,error 即为 error 对象。
4.承诺内容 只能调用一个 resolve 或一个 reject。任何状态的更改都是最终的且不可逆转的。所有其他的再对 resolve 和 reject 的调用都会被忽略
5.由 new Promise 构造器返回的 promise 对象具有以下内部属性:
state—— 最初是 “pending”,然后在 resolve 被调用时变为 “fulfilled”,或者在 reject 被调用时变为 “rejected”。
result —— 最初是 undefined,然后在 resolve(value) 被调用时变为 value,或者在 reject(error) 被调用时变为 error。

Promise对象的状态

一个promise对象只有三种状态:
等待(pending)、已完成(fulfilled)、已拒绝(rejected)
1 . 初始态pending
pending

pending。它的意思是 “待定的,将发生的”,相当于是一个初始状态。创建Promise对象时,且没有调用resolve或者是reject方法,相当于是初始状态。这个初始状态会随着你调用resolve,或者是reject函数而切换到另一种状态。

这个初始状态可以理解为你对别人说出承诺的那个瞬间,此时,大家都不知道这个承诺是否能兑现。

2 . 成功态resolved–也叫fulfilled
resolved

resolved。表示解决了,就是说这个承诺实现了。 要实现从pending到resolved的转变,需要在 创建Promise对象时,在函数体中调用了resolve方法(即第一个参数)。

上面的resolve和reject仅是形参名而已。

3 . 失败态rejected
rejected

rejected。拒绝,失败。表示这个承诺没有做到,失败了。要实现从pending到rejected的转换,只需要在创建Promise对象时,调用reject函数。

简单示例

下面构造了两个promise对象通过分别执行resovle和reject来改变各自的state和result内部属性

let promise = new Promise(function(resolve,reject){
// 1 秒后发出工作已经被完成的信号,并带有state "fulfilled"  result "done"
setTimeout(() => resolve("done"), 1000);
})
			
let promise2 = new Promise(function(resolve,reject){
// 1 秒后发出工作已经被完成的信号,并带有state "fulfilled"  result "done"
setTimeout(() => reject(new Error("哦!我弹出了一个错误")), 1000);
})

拿取结果(Promise)

.then() catch() 与 .finally()

.then()

.then 的第一个参数是一个函数,该函数将在 promise resolved 且接收到结果后执行。
.then 的第二个参数也是一个函数,该函数将在 promise rejected 且接收到 error 信息后执行。
下方代码为两个promise对象执行then()方法(两个promise对象在上文中生成)

promise.then(
result => alert(result), // 1 秒后显示 "done!"
error => alert(error) // 不运行
);
promise2.then( result=>{alert(result)},error => alert(error))

.catch

.catch(err=>{})
如果我们只对 error 感兴趣,那么我们可以使用.then()函数并且 null 作为第一个参数:.then(null, errorHandlingFunction)。
或者我们也可以使用 .catch(errorHandlingFunction),其实是一样的:
.catch(f) 调用是 .then(null, f) 的完全的模拟,它只是一个简写形式

.finally

无论执行是否成功 都会最终调用此函数。但需要注意的是finally 并不意味着处理一个 promise 的结果。如下代码所示 会先执行finally后执行then

new Promise((resolve, reject) => {
  setTimeout(() => resolve("value"), 2000)
})
  .finally(() => alert("Promise ready")) // 先触发
  .then(result => alert(result)); // <-- .then 显示 "value"

相关资料引用:
https://blog.csdn.net/Maybe__row/article/details/124534729

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

soar+

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值