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

前端学习笔记 – promise是什么?能解决什么问题?返回目录promise是什么?promise是异步编程的一种解决方案:从语法上讲,promise是一个对象,从它可以获取异步操作的消息;从本意上讲,它是承诺,承诺它过一段时间会给你一个结果。promise有三种状态:pending(等待态),fulfiled(成功态),rejected(失败态);Promise有以上三种状态,只有异步操作的结果可以决定当前是哪一种状态,其他任何操作都无法改变这个状态状态一旦改变,就不会再变,任何时候都可以得

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

返回目录

promise是什么?

promise是异步编程的一种解决方案:

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

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

promise有三种状态:

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

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

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

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

能解决什么问题?

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

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

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

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

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

promise用法

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.net/133644.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • python输入两个集合取并集_python交集并集差集

    python输入两个集合取并集_python交集并集差集第一种方法:使用python基本数据结构set集合。优点:集合运算长度可以不一致,运算效率高缺点:两个进行运算的集合中不能够含有重复的元素,如果含有的话,转成set集合后,会自动去掉重复元素a=[1,2,3]b=[1,2,6,9,12]print(set(a)&set(b))#交集print(set(a)|set(b))#并集print(set(a)^set(b))#异或,就是两个集合去掉交集的那部分print(set(a)-set(b))#差集,就

    2022年10月6日
  • java冒泡排序概练_Java的冒泡排序[通俗易懂]

    java冒泡排序概练_Java的冒泡排序[通俗易懂]Java的冒泡排序一、冒泡排序基本概念冒泡排序,顾名思义,像冒泡一样的排序。对于一组数字,如{1、4、3、7、5、8、6}这一组数字,使用冒泡排序的话应该是按照以下步骤:第一趟:从第一个数开始,与相邻的数进行比较,然后把大数放在后面,小数放在前面,即先比较第一个数和第二个数,把大数放在后面,小数放在前面,再比较第二个数和第三个数,把大数放在后面,小数放在前面,再比较第三个数和第四个数,把大数放在后…

    2022年7月8日
  • 视觉SLAM技术简述,一文了解视觉SLAM「建议收藏」

    视觉SLAM技术简述,一文了解视觉SLAM「建议收藏」如今科技发展日新月异,随着机器人、AR/VR等人工智能领域的不断发展,视觉SLAM也取得了惊人的发展。本文就视觉SLAM的定义、研究分类、模块、工作原理及应用方向等方面做一个视觉SLAM的技术简述。视觉SLAM是什么?SLAM的英文全称是SimultaneousLocalizationandMapping,中文称作「即时定位与地图创建」,而视觉SLAM就是用摄像头来完成环境的感知工作。当一个自主移动的机器人处在一个未知的环境,它要通过摄像头获取的信息数据对自身以及周围环境进行一个预估.

    2022年10月1日
  • django使用celery_django serializers

    django使用celery_django serializers前言环境celery==5.0.2在安装完celery后,运行celery会报以下错误ModuleNotFoundError:Nomodulenamed'click._bashc

    2022年7月30日
  • navicat 15.0激活码【中文破解版】

    (navicat 15.0激活码)好多小伙伴总是说激活码老是失效,太麻烦,关注/收藏全栈君太难教程,2021永久激活的方法等着你。https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~MLZPB5EL5Q-eyJsaWNlbnNlSWQiOi…

    2022年3月21日
  • 递归算法浅谈

    递归算法浅谈

    2021年12月4日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号