Promise 对象与 Promises/A+ 规范

news2024/9/22 19:38:07

目录

前言

什么是 Promise 对象?

Promises/A+ 规范是什么?

逻辑

示例

用法

结论

参考资料


前言

在现代JavaScript编程中,Promise对象是一种用于处理异步操作的重要工具。它们被广泛用于处理网络请求、文件读取、定时任务等异步操作。本文将介绍Promise对象的概念以及Promises/A+规范,以帮助您更好地理解它们。

什么是 Promise 对象?

Promise是一种用于处理异步操作的JavaScript对象,它表示一个可能会在将来完成的事件或值。Promise有三种状态:

  1. Pending(等待):初始状态,既不是成功,也不是失败。
  2. Fulfilled(已完成):意味着操作成功完成,且返回一个值。
  3. Rejected(已拒绝):意味着操作失败,返回一个错误。

Promise对象用于将异步操作的结果与操作的后续行为关联起来,以实现更清晰的代码结构和更好的错误处理。

Promises/A+ 规范是什么?

Promises/A+ 是一种规范,用于标准化Promise对象的行为,以确保不同JavaScript环境中的Promise实现能够一致地工作。这个规范定义了Promise对象的API和行为,使开发人员可以编写与Promise相关的代码,而不用担心不同Promise库之间的不兼容性。

Promises/A+规范的核心要求包括:

  1. Promise对象必须有一个then方法,用于注册回调函数,并返回一个新的Promise对象。
  2. then方法接受两个参数:onFulfilled(成功时的回调)和onRejected(失败时的回调)。
  3. then方法必须在Promise状态变化后被调用,且按照特定的顺序执行。
  4. Promise必须支持链式调用,即可以通过多次调用then方法来构建Promise链。

逻辑

Promise对象的核心思想是将异步操作的成功和失败处理分离,以便更清晰地组织代码。下面是一个使用Promise的示例:

function fetchData(url) {
  return new Promise((resolve, reject) => {
    // 异步操作,例如发起HTTP请求
    if (/* 操作成功 */) {
      resolve("数据成功");
    } else {
      reject("操作失败");
    }
  });
}

// 使用Promise
fetchData("https://example.com/data")
  .then(data => {
    console.log("成功:", data);
  })
  .catch(error => {
    console.error("失败:", error);
  });

fetchData函数返回一个Promise对象,当异步操作成功时,使用resolve方法来传递成功的结果,而当操作失败时,使用reject方法传递错误信息。然后,通过.then方法来注册成功的回调,通过.catch方法来注册失败的回调。

示例

下面是一个简单的Promise示例,使用setTimeout模拟异步操作:

function delay(ms) {
  return new Promise((resolve) => {
    setTimeout(resolve, ms);
  });
}

console.log("开始");
delay(2000)
  .then(() => {
    console.log("等待了2秒");
    return delay(1000);
  })
  .then(() => {
    console.log("又等待了1秒");
  });

创建了一个延时函数delay,它返回一个Promise对象。通过链式调用.then,我们可以按顺序执行异步操作。

用法

Promise对象广泛用于处理异步操作,如HTTP请求、文件读写、数据库查询等。它们可以帮助您更清晰地组织异步代码,并提供更好的错误处理机制。以下是一些Promise的常见用法:

  • 处理HTTP请求:
fetch("https://api.example.com/data")
  .then(response => response.json())
  .then(data => console.log(data))
  .catch(error => console.error(error));
  • 多个Promise并行执行:
const promise1 = fetchData("url1");
const promise2 = fetchData("url2");

Promise.all([promise1, promise2])
  .then(results => {
    console.log("所有操作成功:", results);
  })
  .catch(error => {
    console.error("至少有一个操作失败:", error);
  });
  • 限制并行执行的Promise数量:
const urls = ["url1", "url2", "url3"];
const maxConcurrent = 2;

const fetchPromises = urls.map(url => fetchData(url));

const limitedPromises = [];

function runNextPromise() {
  if (fetchPromises.length === 0) {
    return Promise.resolve();
  }

  const promise = fetchPromises.shift();
  limitedPromises.push(promise);

  return promise.finally(() => {
    limitedPromises.splice(limitedPromises.indexOf(promise), 1);
  }).then(runNextPromise);
}

const concurrentPromises = limitedPromises.slice(0, maxConcurrent).map(runNextPromise);

Promise.all(concurrentPromises)
  .then(() => {
    console.log("所有操作完成");
  })
  .catch(error => {
    console.error("至少有一个操作失败:", error);
  });

结论

Promise对象是JavaScript中用于处理异步操作的重要工具,它们允许您更清晰地组织代码,提供更好的错误处理机制,以及更好的并行执行控制。Promises/A+规范确保了不同Promise库之间的兼容性,使得Promise在各种JavaScript环境中都可以可靠地使用。

参考资料

  • Promises/A+规范
  • MDN Web Docs: Promise
  • JavaScript Promises: An Introduction

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1144051.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

学习笔记---更进一步的双向链表专题~~

目录 1. 双向链表的结构🦊 2. 实现双向链表🐝 2.1 要实现的目标🎯 2.2 创建初始化🦋 2.2.1 List.h 2.2.2 List.c 2.2.3 test.c 2.2.4 代码测试运行 2.3 尾插打印头插🪼 思路分析 2.3.1 List.h 2.3.2 List.…

一张图系列 - “kv cache“

我觉得回答这个问题需要知道3个知识点: 1、multi-head-attention是如何计算的?attention的数学公式? kv cache是如何存储和传递的? 2、kv cache 的原理步骤是什么?为什么降低了消耗? 3、kv cache 代码模…

Matlab神经网络工具箱——一个例子搞定神经网络算法

本文用到的数据来自于matlab神经网络 数据的文件提取码以及链接会放在评论区 分析数据 这里大致是整个数据的样子,下面来分析数据: ①整个数据一共有401个输入,这里体现的也就是有401种吸光度 ②前五十组数据,既有输入也有输出&a…

2023阿里云双十一服务器优惠价格87元/年,你敢信吗?

2023阿里云双十一服务器优惠价格87元/年,你敢信吗?确实是87元一年,轻量应用服务器2核2G3M带宽,不限制月流量,自带50GB系统盘。活动阿里云服务器网:aliyunfuwuqi.com/go/1111 阿里云轻量应用服务器2核2G3M带…

逆向第一课---安装ADB工具,并使用夜神模拟器连接

1、安装ADB 如果安装了Android SDK可以直接去android_sdk/platform-tools/目录下使用ADB命令。 如果没有安装Android SDK,需要先通过下面的地址下载ADB https://adbdownload.com/ 根据自己的系统点击下载,我这里使用Windows系统,所以下载Wi…

电商接口api数据比价接口推荐

当前,受诸多因素的影响,经济下行,在日趋激烈的市场竞争中,很多企业也都面临着越来越大的生存压力,企业的盈利空间也逐渐被压缩。因此,越来越多的企业在控制成本方面更下功夫,这也就对企业采购提…

SiC器件概念

来源:A SiC Trench MOSFET concept offering improved channel mobility and high reliability SiC MOSFET设计挑战 虽然碳化硅的使用由于是一种宽带隙材料而具有许多优点,但与硅也存在一些值得注意的差异,这导致在制造基于4H-SiC多晶型的Si…

ASO优化之如何提高在本地搜索时的可见度

应用本地化是让我们的应用安装量、转化率实现增长的最佳策略之一。通过本地化,可以让我们的应用程序匹配更广泛的受众,甚至可以使其对不同国家/地区的用户更具吸引力。 1、如何使用搜索优化进行本地搜索? 本地化实际上是应用搜索优化的一部分…

公司电脑如何限制安装软件

公司电脑如何限制安装软件 安企神终端管理系统下载使用 在企业环境中,电脑已经成为企业中必不可少的办公工具,确保员工的生产力和公司的信息安全是至关重要的。为了实现这一目标,公司可能会限制员工在某些情况下安装软件或者由管理员来为终…

Linux——文件权限属性和权限管理

文件权限属性和权限管理 本章思维导图: 注:本章思维导图对应的Xmid文件和.png文件都以传到“资源” 文章目录 文件权限属性和权限管理1. sudo提权和sudoers文件1.1 sudo提权和成为root的区别 2. 权限2.1 Linux群体2.1.1 为什么要有所属组2.1.2 修改文件…

拥抱AI-ChatGPT:人类新纪元

最近大模型通用智能应用持续发酵,各大科技公司都陆续推出了基于通用大模型的智能应用产品,典型的如OpenAI的ChatGPT、微软的BingChat、百度的文心一言、360的智脑、阿里的通义千问等。当然最火的要属于ChatGPT了,从去年年底推出到现在已经有很…

模型工具实现数据库批量追加到空的数据库

一. 下载: http://dt1.8tupian.net/2/29913a50b1000.pg3二. 介绍:许多时候我们的作业数据库需要批量追加到标准的汇交数据库,手动一个层一个层的追加比较麻烦,本工具实现将空间图层和属性数据自动追加到标准空库。

【psychopy】【脑与认知科学】认知过程中的面孔识别加工

目录 实验描述 实验思路 python实现 实验描述 现有的文献认为,人们对倒置的面孔、模糊的面孔等可能会出现加工时长增加、准确率下降的问题,现请你设计一个相关实验,判断不同的面孔是否会出现上述现象。请按照认知科学要求,画…

详细介绍如何使用 NeRF 进行 3D 体积渲染-附源码下载

介绍 在此示例中,我们展示了 Ben Mildenhall 等人的研究论文 NeRF:将场景表示为用于视图合成的神经辐射场的最小实现 。等人。作者提出了一种巧妙的方法,通过神经网络对体积场景函数进行建模来合成场景的新颖视图。 为了帮助您直观地理解这一点,让我们从以下问题开始: 是…

1819_ChibiOS的互斥信号与条件变量

全部学习汇总: GreyZhang/g_ChibiOS: I found a new RTOS called ChibiOS and it seems interesting! (github.com) 1. 关于会吃信号与条件变量的全局配置提供了4个配置信息,分别是互斥信号的使能、互斥信号的递归支持、条件变量的使能、条件变量的超时使…

jQuery图像查看插件Zoom.js

效果图 图片点击放大,再次点击或者滚动窗口或者按 ESC 键即可恢复原始大小,非常流畅,使用方法也非常简单,引入zoom.js和zoom.css文件之后,对图片添加data-action"zoom"属性即可。 使用方法 1,将…

【网络】详解http协议

目录 一、认识URLurlencode和urldecode 二、HTTP协议HTTP协议格式HTTP的方法HTTP的状态码HTTP常见Header 一、认识URL URL叫做统一资源定位符,也就是我们平时俗称的网址,是因特网的万维网服务程序上用于指定信息位置的表示方法。 urlencode和urldecode …

21.10 Python 使用CRC32校验文件

CRC文件校验是一种用于验证文件完整性的方法,通过计算文件的CRC值并与预先计算的CRC校验值进行比较,来判断文件是否发生变化,此类功能可以用于验证一个目录中是否有文件发生变化,如果发生变化则我们可以将变化打印输出&#xff0c…

初次学习dubbo记录

---------------------------------------10.17---------------------------------------- 集群和分布式概念 集群:很多"人"做的相同的一件事,即使有一个人挂掉了,也不会对系统造成致命影响 分布式:很多"人"…

外卖小程序:技术实现与关键代码

在当今数字化的餐饮市场中,外卖小程序扮演着重要的角色。这些应用程序通过技术实现点餐、支付和配送,为用户提供方便快捷的服务。下面我们来深入探讨构建外卖小程序的关键技术要点和代码示例。 1. 前端开发 前端是用户与应用程序交互的接口&#xff0…