Promise简介

Promise是什么?

Promise是异步编程的一种解决方案,它是一个对象,可以获取异步操作的消息,他的出现大大改善了异步编程的困境,避免了地狱回调,它比传统的解决方案回调函数和事件更合理和更强大。

Promise对象创建的实例有三种状态

  • pending(进行中)
  • fulfilled(已完成)
  • rejected(已拒绝)

如何创建Promise实例

new Promise()

Promise构造函数接收一个函数作为参数,该函数的两个参数分别是resolve和reject。

  • resolve : 将Promise对象的状态从 Pending(进行中) 变为 Fulfilled(已成功)
  • reject : 将Promise对象的状态从 Pending(进行中) 变为 Rejected(已失败),并抛出错误。
 const p = new Promise(function (resolve, reject) {
        setTimeout(() => {
            let data = "数据库的数据111";
            let error = "获取失败";
            // resolve(data)
            reject(error);
        }, 1000);
});
    const res = p.then(
        function (data) {
            console.log(data, "获取成功");
        },
        function (error) {
            console.log(error, "获取失败");
            return 'lsh'
        }
    );

Promise.resolve

  // Promise.resolve创建promise实例
    Promise.resolve(11).then(function(val){
        console.log(val, 'val');
    })

如果插入的参数是非Promise类型的对象,则返回的结果为成功的promise对象
如果插入的参数是Promise对象,则参数的结果决定resolve创建的实例的结果

Promise.reject

  // Promise.reject创建promise实例
    Promise.reject('失败').catch(error=>{
        console.log(error, 'error');
    })

使用reject方法创建的实例的状态永远都是rejected,不管参数是数字、字符串或一个成功的promise对象。

Promise方法

(1).then()

then方法可以接受两个回调函数作为参数。第一个回调函数是Promise对象的状态变为resolved时调用,第二个回调函数是Promise对象的状态变为rejected时调用。其中第二个参数可以省略。

then方法基本使用

 // Promise.then方法
    Promise.resolve(11).then(function (val) {
        console.log(val, 'val');
    }, function (error) {
        console.log(error, 'error');
    })

then方法返回的是一个新的Promise实例(不是原来那个Promise实例)。因此可以采用链式写法,即then方法后面再调用另一个then方法。

then方法链式写法

在这里插入图片描述

(2).catch()(then方法的第二个参数)

该方法相当于then方法的第二个参数,指向reject的回调函数。不过catch方法还有一个作用,就是在执行resolve回调函数时,如果出现错误,抛出异常,不会停止运行,而是进入catch方法中。

// Promise.catch方法
    Promise.reject('失败').catch(error => {
        console.log(error, 'error');
    })

(3)all()(全部是fulfilled才返回fulfilled)

all方法可以完成并行任务,它接受一个数组,数组得每一项都是一个promise对象。当数组中所有的promise的状态都达到fulfilled时,all方法的状态也会是fulfilled,如果有一个状态变成了rejected,那么all方法的状态就会变成rejected。

调用all方法结果成功时的回调函数的参数也是一个数组,这个数组按顺序保存着每一个promise对象resolve执行时的值。而失败的时候则返回最先被reject失败状态的值。

let promise1 = new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve(1);
        }, 2000)
    });
    let promise2 = new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve(2);
        }, 1000)
    });
    let promise3 = new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve(3);
        }, 3000)
    });
    // Promise.all方法
    const res = Promise.all([promise1, promise2, promise3]).then(res => {
        console.log(res);
        //结果为:[1,2,3] 
})
    setTimeout(() => {
        console.log(res, 'res');
    }, 4000)

在这里插入图片描述

(4)race()(返回第一个promise对象的值)

race方法和all一样,接受的参数是一个每项都是promise的数组,但是与all不同的是,当最先执行完的事件执行完之后,就直接返回该promise对象的值。如果第一个promise对象状态变成fulfilled,那自身的状态变成了fulfilled;反之第一个promise变成rejected,那自身状态就会变成rejected。

 let promise1 = new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve(1);
        }, 500)
    });
    let promise2 = new Promise((resolve, reject) => {
        setTimeout(() => {
            reject(2);
        }, 200)
    });
    const res = Promise.race([promise1, promise2])
    setTimeout(() => {
        console.log(res, 'res');
    }, 1000)

在这里插入图片描述

(5)finally()(不接受任何参数)

finally方法用于指定不管promise最后的状态,在执行完then或catch指定的回调函数以后,都会执行finally方法指定的回调函数。该方法是 ES2018 引入标准的。
下面是一个例子,服务器使用 Promise 处理请求,然后使用finally方法关掉服务器。

    server.listen(port)
        .then(function () {
            // ...
        })
        .finally(server.stop);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值