• JS中Promise详解


    介绍:

            Promise是JavaScript中进行异步编程的新的解决方案。Promise是一个构造函数,它接收一个函数为参数,并且传入两个参数resolve和reject。resolve的作用是将Promise对象的状态从pending变为fulfilled,在异步操作成功时调用;reject的作用是将Promise对象的状态从pending变为rejected,在异步操作失败时调用。

    Promise的原理:

    Promise的基层原理是通过一种称为"状态机"的概念来实现的。Promise内部有三个状态:pending(进行中)、fulfilled(已完成)和rejected(已拒绝)。初始状态为pending,当异步操作执行完毕后,可以变为fulfilled或rejected。一旦状态改变,就不会再改变。

    Promise的基本原理如下:

    1. 创建Promise对象:通过调用new Promise()来创建一个Promise对象。在这个过程中,会传入一个执行器函数作为参数,该函数接受两个函数参数resolve和reject。

    2. 执行器函数:执行器函数定义了异步操作的逻辑。它可能包含网络请求、文件读写等异步任务。当异步任务成功完成时,调用resolve函数将Promise状态设置为fulfilled,并将结果传递给回调函数;如果出现错误,则调用reject函数将Promise状态设置为rejected,并将错误信息传递给回调函数。

    3. 状态转换:在异步任务执行期间,Promise处于pending状态。当异步任务成功完成时,调用resolve函数将Promise状态从pending转换为fulfilled;当异步任务出现错误时,调用reject函数将Promise状态从pending转换为rejected。

    4. 回调函数注册:Promise提供了then()方法用于注册回调函数。通过then()方法,可以指定在Promise状态变为fulfilled时执行的成功回调函数,以及在Promise状态变为rejected时执行的失败回调函数。then()方法返回一个新的Promise对象,使得可以链式调用then()方法。

    5. 链式调用:通过返回新的Promise对象,可以实现链式调用。在then()方法中,可以返回一个新的Promise对象,然后可以继续调用该对象的then()方法,以及根据需要注册更多的回调函数。这样可以将多个异步操作串联起来,使代码更加清晰和可读。

    6. 错误处理:Promise提供了catch()方法用于捕获并处理错误。catch()方法只会捕获前面所有then()方法中抛出的错误,如果没有发生错误,则不会执行catch()方法。

    promise的使用:

    Promise是JavaScript中用于处理异步操作的一种编程模式。它可以将异步操作转化成类似于同步操作的方式来进行处理,使得代码更易读、简洁和可维护。

    Promise对象表示一个尚未完成但最终会完成的操作,并且可以获取其最终的结果。一个Promise对象只有两种可能的状态:pending(进行中)和fulfilled(已完成)。当一个异步操作执行完成时,Promise的状态会从pending变为fulfilled,并返回异步操作的结果。

    使用Promise主要涉及以下几个步骤:

    1. 创建Promise对象:通过调用Promise构造函数创建一个新的Promise对象。该构造函数接受一个executor函数作为参数,executor函数有两个参数resolve和reject,分别用于成功和失败时的处理。

    javascript

    1. const promise = new Promise((resolve, reject) => {
    2. // 异步操作
    3. });
    1. 处理成功状态(resolved):在executor函数中,当异步操作成功完成时,我们可以调用resolve函数并传递结果值。这将使Promise进入resolved状态。

    javascript

    1. const promise = new Promise((resolve, reject) => {
    2. setTimeout(() => {
    3. resolve('操作成功');
    4. }, 1000);
    5. });
    1. 处理失败状态(rejected):在executor函数中,当异步操作失败时,我们可以调用reject函数并传递一个错误对象。这将使Promise进入rejected状态。

    javascript

    1. const promise = new Promise((resolve, reject) => {
    2. setTimeout(() => {
    3. reject(new Error('操作失败'));
    4. }, 1000);
    5. });
    1. 处理Promise状态:可以使用Promise的then方法来处理resolved状态和catch方法来处理rejected状态。then方法接收一个回调函数作为参数,该回调函数会在Promise对象状态变为resolved时执行,并接收到resolve函数传递的结果值。catch方法也接收一个回调函数作为参数,该回调函数会在Promise对象状态变为rejected时执行,并接收到reject函数传递的错误对象。

    javascript

    1. promise.then((result) => {
    2. console.log(result); // 操作成功
    3. }).catch((error) => {
    4. console.error(error); // Error: 操作失败
    5. });
    1. 处理Promise链:通过返回新的Promise对象,我们可以构建一个Promise链,以便按顺序处理多个异步操作。在then方法中,我们可以返回一个新的Promise对象或值,它将成为下一个then方法的回调函数的参数。

    javascript

    1. const promise = new Promise((resolve, reject) => {
    2. setTimeout(() => {
    3. resolve('操作1完成');
    4. }, 1000);
    5. });
    6. promise.then((result) => {
    7. console.log(result); // 操作1完成
    8. return new Promise((resolve) => {
    9. setTimeout(() => {
    10. resolve('操作2完成');
    11. }, 1000);
    12. });
    13. }).then((result) => {
    14. console.log(result); // 操作2完成
    15. }).catch((error) => {
    16. console.error(error);
    17. });

    这是Promise的基本使用方式,能够简化异步编程,并提供了更好的可读性和可维护性。但需要注意的是,Promise并不是解决所有异步问题的银弹,仍然需要根据具体需求选择合适的异步处理方式。

  • 相关阅读:
    emacs配置教程
    初识_JDK代理cglib代理_1
    [VCS、verdi、makefile] 联合仿真 ——步骤
    拉格朗日插值法(理论详解)
    【LeetCode】按要求补齐数组 [H](贪心)
    数据库基本概念
    进大厂必备的Java八股文大全(2022最强精简易懂版,八股文中的八股文)备战秋招,赶快转发收藏起来吧~
    Qt的网络连接方式
    操作系统之虚拟内存总结
    Go 包操作之如何拉取私有的Go Module
  • 原文地址:https://blog.csdn.net/wangxuanyang_zer/article/details/132840242