前端学习笔记 – 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);
    });

参考:链接

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • kl1083_奥什科什M1083

    kl1083_奥什科什M1083Windy 定义了一种 Windy 数:不含前导零且相邻两个数字之差至少为 2 的正整数被称为 Windy 数。Windy 想知道,在 A 和 B 之间,包括 A 和 B,总共有多少个 Windy 数?输入格式共一行,包含两个整数 A 和 B。输出格式输出一个整数,表示答案。数据范围1≤A≤B≤2×109输入样例1:1 10输出样例1:9输入样例2:25 50输出样例2:20#include<bits/stdc++.h>using namespace std;

  • 随机梯度下降法概述与实例分析_梯度下降法推导

    随机梯度下降法概述与实例分析_梯度下降法推导机器学习算法中回归算法有很多,例如神经网络回归算法、蚁群回归算法,支持向量机回归算法等,其中也包括本篇文章要讲述的梯度下降算法,本篇文章将主要讲解其基本原理以及基于SparkMLlib进行实例示范,不足之处请多多指教。梯度下降算法包含多种不同的算法,有批量梯度算法,随机梯度算法,折中梯度算法等等。对于随机梯度下降算法而言,它通过不停的判断和选择当前目标下最优的路径,从而能够在最短路径…

  • 使用lombok解决默认值问题

    使用lombok解决默认值问题

  • MySQL创建用户与授权方法

    MySQL创建用户与授权方法

    2021年10月19日
  • Pytest(13)命令行参数–tb的使用「建议收藏」

    Pytest(13)命令行参数–tb的使用「建议收藏」前言pytest使用命令行执行用例的时候,有些用例执行失败的时候,屏幕上会出现一大堆的报错内容,不方便快速查看是哪些用例失败。–tb=style参数可以设置报错的时候回溯打印内容,可以设置参

  • 【致远FAQ】致远OA宕机之Tomcat异常宕机

    【致远FAQ】致远OA宕机之Tomcat异常宕机问题描述tomcat进程已经不在; 由于在启动命令行参数中增加了相关的日志监控,重点查找JVM内存溢出、jvm的crash的日志进行问题定位; 没有.hprof文件生成【基本可以推论没有出现JVM内存溢出】 没有hs_err_xxx.log文件生成【基本可以推论JVM没有出现严重的crash异常】问题分析1)通过catalina.log看出tomcat出现了非正常关闭操作下的停机;如果是正常停机会在输出图1的日志前输出如图2所示的内容2)tomcat停机的时..

发表回复

您的电子邮箱地址不会被公开。

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