JavaScript中的Promise

Promise 是 JavaScript 中的一个对象,代表了一个异步操作的最终完成或失败的结果。它允许您将回调从嵌套(或回调地狱)转移到更扁平、链式的调用方式。

以下是关于 Promise 的基础知识:

  1. 三种状态:

    • Pending: 初始状态,既不是成功,也不是失败。
    • Fulfilled: 意味着操作成功完成。
    • Rejected: 意味着操作失败。
  2. 构造函数:

    javascript 复制代码
    const promise = new Promise((resolve, reject) => {
        if (/* 一些异步操作成功 */) {
            resolve('Success');
        } else {
            reject('Failure');
        }
    });
  3. 方法:

    • .then(): 当 Promise 完成时,无论其是被解决还是被拒绝,都会执行该方法。
    • .catch(): 当 Promise 被拒绝时,该方法会被调用。
    • .finally(): 无论 Promise 被解决还是被拒绝,都会执行该方法。
    javascript 复制代码
    promise
        .then(result => {
            console.log(result);
        })
        .catch(error => {
            console.log(error);
        })
        .finally(() => {
            console.log('Promise settled');
        });
  4. 静态方法:

    • Promise.resolve(value) : 返回一个以给定值解析后的 Promise
    • Promise.reject(reason) : 返回一个带有拒绝原因的 Promise
    • Promise.all(iterable) : 当所有的 Promise 都完成时,该方法返回一个新的 Promise
    • Promise.race(iterable) : 返回一个 Promise,它在 iterable 中的任何一个 Promise 完成或拒绝后,就立即使用该 Promise 的值来解析或拒绝。
  5. 错误处理:

    • 如果在 Promise 内部发生错误,并且没有处理(例如没有 .catch()),则该错误不会被捕获,而是会导致应用程序崩溃或"未捕获的 promise 异常"警告。
  6. 链式调用:

    • Promise 允许链式调用 .then(),这意味着一个 .then() 可以返回另一个 Promise,这使得异步代码的组织和处理变得更加简洁。

Promise 提供了一种更优雅、可读性更强的方式来处理异步操作,而不是传统的回调函数方式。这是现代 JavaScript 中异步编程的核心概念之一,尤其在 ES6 和更高版本中。

注意: 如果Promise.all中的任何一个Promise失败(被reject),那么Promise.all本身会立即失败,并返回那个导致失败的Promise的错误值。

换句话说,Promise.all是"短路"的,只要其中一个Promise失败,它就不会等待其他的Promise,而是立即失败。

这里是一个简单的例子来说明这点:

javascript 复制代码
let p1 = Promise.resolve("Success");
let p2 = new Promise((resolve, reject) => {
    setTimeout(() => {
        reject("Error from p2");
    }, 1000);
});
let p3 = new Promise((resolve, reject) => {
    setTimeout(() => {
        resolve("Success from p3");
    }, 2000);
});

Promise.all([p1, p2, p3])
    .then(values => {
        console.log(values);  // 这行不会执行
    })
    .catch(error => {
        console.log(error);  // 输出:"Error from p2"
    });

在这个例子中,尽管p3在2秒后会成功解决,但由于p2在1秒后失败,Promise.all会立即失败,并捕获到错误:"Error from p2"。

如果你想让所有的Promise都执行完,不管它们是否失败,并收集它们的结果或错误,你可能想要使用Promise.allSettled。这个API在所有的Promise都定履行(不论fulfilled或rejected)之后,返回一个新的Promise,它将解决为一个包含每个Promise的结果对象的数组。

相关推荐
前端大卫39 分钟前
为什么 React 中的 key 不能用索引?
前端
你的人类朋友40 分钟前
【Node】手动归还主线程控制权:解决 Node.js 阻塞的一个思路
前端·后端·node.js
小李小李不讲道理3 小时前
「Ant Design 组件库探索」五:Tabs组件
前端·react.js·ant design
毕设十刻3 小时前
基于Vue的学分预警系统98k51(程序 + 源码 + 数据库 + 调试部署 + 开发环境配置),配套论文文档字数达万字以上,文末可获取,系统界面展示置于文末
前端·数据库·vue.js
mapbar_front3 小时前
在职场生存中如何做个不好惹的人
前端
牧杉-惊蛰4 小时前
纯flex布局来写瀑布流
前端·javascript·css
一袋米扛几楼985 小时前
【软件安全】什么是XSS(Cross-Site Scripting,跨站脚本)?
前端·安全·xss
向上的车轮5 小时前
Actix Web适合什么类型的Web应用?可以部署 Java 或 .NET 的应用程序?
java·前端·rust·.net
XiaoYu20025 小时前
第1章 核心竞争力和职业规划
前端·面试·程序员
excel5 小时前
🧩 深入浅出讲解:analyzeScriptBindings —— Vue 如何分析 <script> 里的变量绑定
前端