前端学习笔记 – 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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 马拉车算法详解, C++代码实现

    马拉车算法详解, C++代码实现算法介绍马拉车算法是用来在一个字符串中寻找最长回文串 正着读和反着读都相同的字符串 的一种算法 该算法运用了动态规划的思想 将寻找最长回文串算法的时间复杂度降低到了线性 算法原理对于一个字符串要判断它是否为回文串要分为字符串长度为奇数或者偶数两种情况 为了简化做法 我们进行如下的操作 在字符串的两端和每两个字符中间添加一个 或者任意一个一定不会在字符串中出现的字符 通常就是 啦 再在字符串的开始和结尾放置字符串开始和结束的标识符 上述操作后拓展出来的字符串的长度一定是奇数

    2025年6月6日
    1
  • java中两个list取交集_判断两个list是否有交集

    java中两个list取交集_判断两个list是否有交集List&lt;int&gt;a1=newList&lt;int&gt;{1,2,3,4,5};List&lt;int&gt;a2=newList&lt;int&gt;{3,4,5,6,7};vara3=a1.Intersect(a2);foreach(varitemina3){Console.WriteLine(it…

    2022年10月7日
    6
  • 最全Python学习路线图【2020最新版】

    最全Python学习路线图【2020最新版】2020年最新的python学习大纲,专为python高薪打造另外很多人在学习Python的过程中,往往因为没有好的教程或者没人指导从而导致自己容易放弃,为此我建了个Python交流.裙:一久武其而

    2022年7月5日
    26
  • 光纤交换机划分zone图解

    光纤交换机划分zone图解 HP光纤存储交换机 用户:admin出厂密码:password出厂IP:10.77.77.77 用串口连上交换机,help查出可用的命令IpaddrShow 命令查看IP地址,然后用IE浏览器输入http://10.77.77.77登陆交换机。   划分ZONE点击左下角图标  输入用户admin密码password,进入

    2022年5月21日
    50
  • 以管理员身份运行IJ

    以管理员身份运行IJ

    2022年6月27日
    28
  • webservice框架有哪些_webservice框架发布方式

    webservice框架有哪些_webservice框架发布方式毕业了,一直更新技术博客,也跳槽到一家上市的公司,他们产品的主要通讯是通过Webservice,以前对Webservice只是做了大致的了解,今天就在网上找一些开源的知识点,现在市面上主流的夸平台传送有JSON和SOAP两种数据格式,总结一下。以下转自至 http://yulimin.iteye.com/blog/128498新一代的WebServices框架如Axis2、CXF都

    2022年9月21日
    4

发表回复

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

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