Promis及其应用

目录

Promise及其应用

异步编程与Promise的关系

Promise的作用与用法

作用

用法

Promise应用

.then()

.catch()

async/await的作用与用法

参考资料


Promise及其应用

异步编程与Promise的关系

  • Promise是异步编程的一种解决方案
  • 异步任务有两个结果时(成功或者失败)使用
  • 规范回调的名字和顺序
  • 方便捕获错误
  • 避免出现回调地狱

Promise的作用与用法

作用

  • promise是一个对象,对象和函数的区别就是对象可以保存状态,函数不可以(闭包除外)
  • 并未剥夺函数return的能力,因此无需层层传递callback,进行回调获取数据
  • 容易理解,便于维护

用法

Promise有三种状态:

pending:进行中

fulfilled:已成功

rejected:已失败

一旦状态改变(pending->fulfilled或者pending->rejected),就会触发then()中的响应函数。

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

resolve函数改变状态pending->fulfilled

reject函数改变状态pending->rejected

Promise应用

.then()

  1. 接收两个函数作为参数,分别代表fulfilled(成功)和rejected(失败)
  2. .then()返回一个新的Promise实例,所以它可以链式调用
  3. 当前面的Promise状态改变时,.then()根据其最终状态,选择特定的状态响应函数执行
  4. 状态响应函数可以返回新的promise,或其他值,不返回值也可以我们可以认为它返回了一个null;
  5. 如果返回新的promise,那么下一级.then()会在新的promise状态改变之后执行
  6. 如果返回其他任何值,则会立即执行下一级.then()
let p=new Promise((resolve,reject)=>{
    console.log("Promise");
    resolve();    //将pending状态转化为fulfilled,就可以调用.then()方法中的第一个函数
}).then(()=>{console.log('Resolved.')},
()=>{console.log('Reject.')});
console.log('Hi!');
//输出:Promise Hi! Resolved.

let p1=new Promise((resolve,reject)=>{
    console.log("Promise");
    reject();    //将pending状态转化为rejected,就可以调用.then()方法中的第二个函数
}).then(()=>{console.log('Resolved.')},
()=>{console.log('Reject.')});
console.log('Hi!');
//输出:Promise Hi! Reject.

.catch()

用于指定发生错误时的回调函数。

catch()方法返回一个Promise,而它的行为与catch中的回调函数的返回值有关:

如果catch中的回调函数返回一个值或者没有返回值,那么catch返回的Promise将会成为Resolved状态,并且将返回的值作为Resolved状态的回调函数的参数值。上述代码中的c的状态就是Resolved状态。

如果catch中的回调函数抛出一个错误,那么catch返回的Promise将会成为Rejected状态,并且将抛出的错误作为Rejected状态的回调函数的参数值。

let p2=new Promise((resolve,reject)=>{
    console.log("Promise");
    reject();    //将pending状态转化为rejected,因为.then()方法中只有一个参数,故执行后面的catch()
}).then(()=>{
console.log('Resolved.');
}).catch(()=>{
    console.log("Error!")
})
console.log('Hi!');
//输出:Promise Hi! Error!

async/await的作用与用法

async是一个加在函数前的修饰符,被async定义的函数会默认返回一个Promise对象resolve的值。因此对async函数可以直接then,返回值就是then方法传入的函数。

await 也是一个修饰符,只能放在async定义的函数内。可以理解为等待。

await 修饰的如果是Promise对象:可以获取Promise中返回的内容(resolve或reject的参数),还可以继续给 await 的返回值使用 .then() 函数和.catch();如果不是Promise对象:把这个非promise的东西当做await表达式的结果。

 function s() {
            return new Promise((resolve, reject) => {
                console.log("Promise");
                resolve();
            })
        }
        async function test() {
            let a = await s().then(() => { console.log("ok") });
            console.log("a");
        }
        test();
        //输出:Promise ok a
        
 function s() {
            return new Promise((resolve, reject) => {
                console.log("Promise");
                reject();
            })
        }
        async function test() {
            let a = await s().catch(() => { console.log("error") });
            console.log("a");
        }
        test();
        //输出:Promise error a

参考资料

【Promise与异步】理解并使用Promise_不知名网友小H的博客-CSDN博客

什么是promise?promise的作用是什么?_canoe777的博客-CSDN博客

Promise对象解析(3)catch方法

async/await 的理解和用法_前端之神的博客-CSDN博客

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值