前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >前端学习笔记 – promise是什么?能解决什么问题?

前端学习笔记 – promise是什么?能解决什么问题?

作者头像
全栈程序员站长
发布2022-06-27 08:27:01
4430
发布2022-06-27 08:27:01
举报
文章被收录于专栏:全栈程序员必看

大家好,又见面了,我是你们的朋友全栈君。

返回目录

promise是什么?

代码语言:javascript
复制
promise是异步编程的一种解决方案:

    从语法上讲,promise是一个对象,从它可以获取异步操作的消息;

    从本意上讲,它是承诺,承诺它过一段时间会给你一个结果。

promise有三种状态:

    pending(等待态),fulfiled(成功态),rejected(失败态);

    Promise有以上三种状态,只有异步操作的结果可以决定当前是哪一种状态,其他任何操作都无法改变这个状态

    状态一旦改变,就不会再变,任何时候都可以得到这个结果,状态不可以逆,只能由 pending变成fulfilled或者由pending变成rejected

    创造promise实例后,它会立即执行。

能解决什么问题?

代码语言:javascript
复制
一般来说我们会碰到的回调嵌套都不会很多,一般就一到两级,但是某些情况下,回调嵌套很多时,代码就会非常繁琐,会给我们的编程带来很多的麻烦,这种情况俗称回调地狱。

promise是用来解决两个问题的:

    1、回调地狱,代码难以维护,常常第一个的函数的输出是第二个函数的输入这种现象

    2、promise可以支持多个并发的请求,获取并发请求中的数据

    注:这个promise可以解决异步的问题,本身不能说promise是异步的
代码语言:javascript
复制
//一般回调模式
function sleep(time, callback) { 
   
    setTimeout(function () { 
   
        callback();
    }, time);
}
sleep(5000, function () { 
   
    console.log('我会在5秒后打印');
});
代码语言:javascript
复制
//promise模式
function sleep(time) { 
   
    return new Promise((resolve) => setTimeout(resolve, time));
}
sleep(5000).then(() => console.log('我会在5秒后打印'));

promise用法

代码语言:javascript
复制
promise是一个构造函数,自己身上有all、reject、resolve这几个方法,原型上有then、catch等方法。

1、创建

    let p = new Promise((resolve, reject) => {});

    Promise的构造函数接收一个参数:

        函数,并且这个函数需要传入两个参数:

            resolve:异步操作执行成功后的回调函数

            reject:异步操作执行失败后的回调函数

2、then链式操作的用法

    p.then((data) => {
        console.log(data);
    })
    .then((data) => {
        console.log(data);
    })
    .then((data) => {
        console.log(data);
    });

3、reject的用法

    把Promise的状态置为rejected,这样我们在then中就能捕捉到,然后执行“失败”情况的回调。

    let p = new Promise((resolve, reject) => {
        let num = Math.ceil(Math.random() * 10);//生成1-10的随机数
        if (num <= 5) {
            resolve(num);
        } else {
            reject('数字不符合要求');
        }
    });
    p.then((data) => {
        console.log(num);
    }, (err) => {
        console.log('rejected', err);
    };

    then中传了两个参数,then方法可以接受两个参数,第一个对应resolve的回调,第二个对应reject的回调,所以我们能够分别拿到他们传过来的数据。

4、catch的用法

    Promise对象除了then方法,还有一个catch方法,它和then的第二个参数一样,用来指定reject的回调。

    p.then((data) => {
        console.log(data);
    }).catch((err) => {
        console.log('rejected', err);
    });

    效果和写在then的第二个参数里面一样。不过它还有另外一个作用:在执行resolve的回调(也就是上面then中的第一个参数)时,如果抛出异常了(代码出错了),那么并不会报错卡死,而是会进到这个catch方法中。

5、all的用法

    谁跑的慢,以谁为准执行回调。all接收一个数组参数,里面的值最终都算返回Promise对象

    Promise的all方法提供了并行执行异步操作的能力,并且在所有异步操作执行完后才执行回调。

    let Promise1 = new Promise((resolve, reject) => {});
    let Promise2 = new Promise((resolve, reject) => {});
    let Promise3 = new Promise((resolve, reject) => {});
    let p = Promise.all([Promise1, Promise2, Promise3]);

    p.then(() => {
        //三个都成功,则成功  
    }, () => {
        //只要有失败,则失败
    });

6、race的用法

    谁跑的快,以谁为准执行回调

    race按字面解释,就是赛跑的意思。race的用法与all一样,只不过all是等所有异步操作都执行完毕后才执行then回调。而race的话只要有一个异步操作执行完毕,就立刻执行then回调。

    注意:其它没有执行完毕的异步操作仍然会继续执行,而不是停止。

    Promise.race([Promise1, Promise2]).then((data) => {
        console.log(data);
    }).catch((err) => {
        console.log(err);
    });

参考:链接

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/133644.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年6月8,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 返回目录
  • promise是什么?
  • 能解决什么问题?
  • promise用法
  • 参考:链接
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档