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

参考:链接

你可能感兴趣的:(前端学习笔记,promise)