【05问:Promise的理解与使用】

目录

一、什么是Promise

二、Promise的缺点

三、Promise的实例有三个状态

四、对于Promise的理解

五、Promise 的构造与使用

六、使用 Promise 处理异步操作

七、Promise 的链式调用

八、Promise.all 和 Promise.race

总结


一、什么是Promise

  • Promise 是异步编程的一种解决方案,Promise 很好地解决了回调地狱的问题,比传统的解决方案回调函数和事件更合理和更强大。
  • Promise是一个对象,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果
  • 将异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数。流程更加清晰,代码更加优雅。

二、Promise的缺点

  • 无法取消Promise,一旦新建它就会立即执行,无法中途取消。
  • 如果不设置回调函数,Promise内部抛出的错误,不会反应到外部。
  • 当处于pending状态时,无法得知目前进展到哪一个阶段(刚刚开始还是即将完成)

三、Promise的实例有三个状态

  • Pending(进行中)
  • Resolved(已完成)
  • Rejected(已拒绝)

四、对于Promise的理解

  • Promise是处理异步操作的解决方案,当异步操作成功返回时,会用resolve把成功的信息递交给使用者,如果异步操作失败会用reject把错误原因递交给使用者。
  • 平时的话处于pending状态,当结果来了会进入工作状态,要么从pending到fulfilled,要不pending到rejected,直到把结果交出去,就完成了它的工作。
  • 在它的原型上面有两个方法,then和catch方法,当异步操作失败,reject递交错误原因的时候,就会走catch这个方法,catch携带的参数会被调用,获取错误的原因。then可以接收两个参数,当异步操作成功时,第一个参数会获取成功的信息,第二个参数是异步操作发生错误时,可以获取错误原因。
  • Promise业务能力是比较强的,他一次不仅仅只能处理一个异步操作,他可以同时处理多个异步操作,他有all和racel方法,all方法是只有在他接收所有Promise都接收成功才会返回成功,继续往下走。(要过一起过)racel方法不管成功还是失败,他都会立马往下走

五、Promise 的构造与使用

创建一个 Promise 对象需要传入一个执行器函数(executor function),该函数接受两个参数:resolve 和 reject。这两个参数都是函数,resolve 用于将 Promise 状态从 pending 变为 fulfilled,reject 用于将状态从 pending 变为 rejected。

const myPromise = new Promise((resolve, reject) => {
    // 异步操作
    let success = true;  // 假设一个操作是否成功的条件

    if (success) {
        resolve('操作成功');  // 将状态变为 fulfilled
    } else {
        reject('操作失败');  // 将状态变为 rejected
    }
});

六、使用 Promise 处理异步操作

Promise 的强大之处在于它可以通过 then 方法和 catch 方法链式调用,分别处理成功和失败的情况。

myPromise
    .then(result => {
        console.log(result);  // 输出: 操作成功
    })
    .catch(error => {
        console.error(error);  // 输出: 操作失败
    });

七、Promise 的链式调用

Promise 的另一个优点是可以链式调用多个异步操作,使得代码更加简洁和易读。

const promise1 = new Promise((resolve, reject) => {
    setTimeout(() => resolve('First promise resolved'), 1000);
});

const promise2 = new Promise((resolve, reject) => {
    setTimeout(() => resolve('Second promise resolved'), 2000);
});

promise1
    .then(result1 => {
        console.log(result1);  // 输出: First promise resolved
        return promise2;       // 返回另一个 Promise
    })
    .then(result2 => {
        console.log(result2);  // 输出: Second promise resolved
    })
    .catch(error => {
        console.error(error);
    });

八、Promise.all 和 Promise.race

Promise.all: 接受一个包含多个 Promise 的数组,当所有 Promise 都成功时返回一个新的 Promise,其值是所有 Promise 结果的数组;如果有一个 Promise 失败,则返回失败的 Promise。

Promise.all([promise1, promise2])
    .then(results => {
        console.log(results);  
        // 输出: ['First promise resolved', 'Second promise resolved']
    })
    .catch(error => {
        console.error(error);
    });

Promise.race: 接受一个包含多个 Promise 的数组,当其中任何一个 Promise 完成时返回一个新的 Promise,其值是第一个完成的 Promise 的结果。

Promise.race([promise1, promise2])
    .then(result => {
        console.log(result);  // 输出第一个完成的 Promise 的结果
    })
    .catch(error => {
        console.error(error);
    });

总结

Promise 提供了一种更加优雅和强大的方式来处理 JavaScript 中的异步操作。通过 thencatch 方法及链式调用,开发者可以编写更简洁、易读和易维护的异步代码。此外,Promise.allPromise.race 等方法进一步增强了对复杂异步流程的控制能力。

Promise 是现代 JavaScript 开发中的重要工具,它不仅改善了代码质量,也为后续的 async/await 提供了基础。掌握 Promise 的使用对于任何希望深入了解 JavaScript 异步编程的开发者来说都是必不可少的。

  • 29
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值