Promise简单入门

Promise

☀️作者简介:大家好我是言不及行yyds
🐋个人主页:言不及行yyds的CSDN博客
🎁系列专栏:【前端技术】

前言:通过这篇文章,你能对Promise有一个简单的理解

1.Promise(又称期约)

1.1理解

  • 抽象表达:是一门新的技术(ES6规范)

    ​ 是JS进行异步编程的新解决方案

    ​ (原先是通过回调函数实现)

  • 具体表达:是一个构造函数。Promise对象用来封装一个

    ​ 异步操作并且可以获取其成功/失败的值

1.2使用场景

定时器 读取文件 AJAX请求 等

1.3代码风格

//创建Promise对象
new Promise((resolve,reject)=>{
    //你的异步操作比如
    setTimeout(()=>{
 
    },1000)    
})

1.4Promise值和Promise决议

Promise决议是判断Promise对象应该得到那些Promise值

2.Promise使用流程

请添加图片描述

2.1状态的改变

  • pending 变为 resolved
  • pending 变为 rejected

只有这 2 种, 且一个 promise 对象只能改变一次
无论变为成功还是失败, 都会有一个结果数据
成功的结果数据一般称为 value, 失败的结果数据一般称为 reason

2.2基本使用

let p = new Promise((resolve, reject) => {
        setTimeout(() => {
          const time = Date.now();
          if (time % 2 == 0) {
            resolve(time + "it is ok");
          } else {
            reject(time + "it maybe have not good");
          }
        }, 1000);
      });
      p.then(
        (value) => {
          console.log(value);
        },
        (resonal) => {
          console.log(resonal);
        }
 		);

请添加图片描述

请添加图片描述

代码解释

p封装一个包含异步操作,通过reject()和resolve()用来存储数据向p.then()

发送数据。

p.then()通常有两个回调函数,第一个是成功的回调函数,第二个是失败的回调函数

可简写为

p.then(
    	//value是resolve()里面的值
    	//如果传入的参数为 非Promise类型的对象则这个值就是他的本身
    	//如果是Promise类型的对像 他的参数结果决定了value的值
        (value) => {
          console.log(value);
        },
    	//resonal是reject()里面的值跟上面的一样
        (resonal) => {
          console.log(resonal);
        }
 	);

2.3链式调用

let p = new Promise((resolve, reject) => {
            setTimeout(() => {
                resolve('OK');
            }, 1000);
        });

        p.then(value => {
            return new Promise((resolve, reject) => {
                resolve("success");
            });
        }).then(value => {
            console.log(value);
        },resolve=>{}).then(value => {
            console.log(value);
        },resolve=>{})

请添加图片描述

**类似与p.then(….).then(…).then(….) .then()返回的值取决与前面reject(….)和teject(…)**中的值

3.为什么要使用Promise

3.1使用Promise使用回调函数的方式更加灵活

  • 在之前的回调函数中,只能在启动异步任务的前面
  • promise: 启动异步任务 => 返回promie对象 => 给promise对象绑定回调函
    数(甚至可以在异步任务结束后指定/多个)

3.2回调地狱

请添加图片描述

  • 问题就是回调函数异步执行的结果是嵌套的回调执行的条件
  • 不便于阅读,不便于异常处理

4.Promise的API

4.1Promise.resolve()

let p1 = Promise.resolve(521);
//如果传入的参数为 非Promise类型的对象, 则返回的结果为成功promise对象
  //如果传入的参数为 Promise 对象, 则参数的结果决定了 resolve 的结果
let p2 = Promise.resolve(new Promise((resolve, reject) => {
            // resolve('OK');
            reject('Error');
        }));
        // console.log(p2);
        p2.catch(reason => {
            console.log(reason);
        })

请添加图片描述

4.2Promise.reject()

let p3 = Promise.reject(new Promise((resolve, reject) => {
            resolve('OK');
        }));
 console.log(p3);

Promise.reject()等到值为失败

4.3Promise.all([….])

Promise.all([…])需要一个参数,是一个数组。通常由Promise实例组成

只有当数值内的promise实例必须都是完成的(即是成功的),有任何一

个是被拒绝的,则最终的结果的为失败的。

let p1 = new Promise((resolve, reject) => {
            resolve('OK');
        })
// let p2 = Promise.resolve('Success');
 let p2 = Promise.reject('Error');
 let p3 = Promise.resolve('Oh Yeah');
 const result = Promise.all([p1, p2, p3]);
  console.log(result);

在这里插入图片描述

4.4Promise.race([…])

必须要有一个参数,为数组,由一个或多个组成,跟前面的效果类似。

但是一旦有任何一个成功了,则结果就出来了,不在接下来的运行。

就像一个竞赛

let p1 = new Promise((resolve, reject) => {
            setTimeout(() => {
                resolve('OK');
            }, 1000);
        })
        let p2 = Promise.resolve('Success');
        let p3 = Promise.resolve('Oh Yeah');

        //调用
        const result = Promise.race([p1, p2, p3]);

        console.log(result);

在这里插入图片描述

扩展API

  • Promise.none([…])

    类似与.all([…]),不过结果是相反的,所有的Promise都会被拒绝

  • Promise.any([…])

    类似与.all([…]),忽略拒绝,只要有一个成功,就代表成功

  • Promise.first([…])

    只要第一个Promise成功则会忽略后续的Promise操作

  • Promise.last([…])

    只要最后一个Promise成功

本期就结束了,如果对你有帮助,点赞+收藏支持一下博主再走吧
还没有关注言不及行yyds的朋友,点个关注每天学一点前端知识
下期预告: 【Promise的信任问题和几个关键问题】
在这里插入图片描述
在这里插入图片描述

  • 15
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 14
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

言不及行yyds

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

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

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

打赏作者

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

抵扣说明:

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

余额充值