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的结果对象的数组。

相关推荐
蟾宫曲3 小时前
在 Vue3 项目中实现计时器组件的使用(Vite+Vue3+Node+npm+Element-plus,附测试代码)
前端·npm·vue3·vite·element-plus·计时器
秋雨凉人心3 小时前
简单发布一个npm包
前端·javascript·webpack·npm·node.js
liuxin334455663 小时前
学籍管理系统:实现教育管理现代化
java·开发语言·前端·数据库·安全
qq13267029403 小时前
运行Zr.Admin项目(前端)
前端·vue2·zradmin前端·zradmin vue·运行zradmin·vue2版本zradmin
魏时烟4 小时前
css文字折行以及双端对齐实现方式
前端·css
哥谭居民00015 小时前
将一个组件的propName属性与父组件中的variable变量进行双向绑定的vue3(组件传值)
javascript·vue.js·typescript·npm·node.js·css3
踢足球的,程序猿5 小时前
Android native+html5的混合开发
javascript
2401_882726485 小时前
低代码配置式组态软件-BY组态
前端·物联网·低代码·前端框架·编辑器·web
web130933203985 小时前
ctfshow-web入门-文件包含(web82-web86)条件竞争实现session会话文件包含
前端·github
胡西风_foxww5 小时前
【ES6复习笔记】迭代器(10)
前端·笔记·迭代器·es6·iterator