Promise其实也不难

 难点图解:then()方法

a01d447934ca4ffda2be39503b3a53ed.png

ES6学习网站:ES6 入门教程

解决:回调地狱(回调函数中嵌套回调)

两个特点:

(1)对象的状态不受外界影响。Promise对象代表一个异步操作,有三种状态:pending(进行中)、fulfilled(已成功)和rejected(已失败)。只有异步操作的结果,可以决定当前是哪一种状态,任何其他操作都无法改变这个状态。

(2)一旦状态改变,就不会再变,任何时候都可以得到这个结果Promise对象的状态改变,只有两种可能:从pending变为fulfilled和从pending变为rejected。只要这两种情况发生,状态就凝固了,不会再变了,会一直保持这个结果,这时就称为 resolved(已定型)。如果改变已经发生了,你再对Promise对象添加回调函数,也会立即得到这个结果。这与事件(Event)完全不同,事件的特点是,如果你错过了它,再去监听,是得不到结果的。

创建 Promise

你可以使用 new Promise() 构造函数来创建一个 Promise。它接受一个带有 resolvereject 两个参数的函数,这个函数会在异步操作完成(成功或失败)时被调用。

let myPromise = new Promise((resolve, reject) => {
  // 异步操作
  setTimeout(() => {
    let success = true;
    if (success) {
      resolve("操作成功!"); // 成功时调用 resolve,状态fulfill且改变当前promise对象的结果
    } else {
      reject("操作失败!"); // 失败时调用 reject
    }
  }, 2000); // 模拟2秒延迟
});

  Promise原型的方法

then()

p.then(value)=>{console.log('value')},成功调用时执行,resolve()类似声明,将形参传给then()方法

在then()方法的参数函数中,通过形参使用promise对象的结果

如果promise的状态不改变,then()里的方法不会执行

使用return会将当前promise实例的状态改成fulfilled,return返回值将作为形参传给下一个then()

如果当前then()中代码出错,会将promise实例的状态改成rejected
53b4f135c03e44deb2c486e89051026d.png

3ed262dd936c49878cb587cb1ea2499a.png

catch()

catch(),失败调用时执行

何时触发?reject()或者Promise执行体中有错

处理 Promise

使用 then() 方法来处理 Promise 对象的成功完成情况,并使用 catch() 方法来处理失败情况。

myPromise.then((message) => {
  console.log("成功:", message); // Promise 被 resolve 时执行
}).catch((error) => {
  console.error("错误:", error); // Promise 被 reject 时执行
});

 上边说到Promise是一个构造函数,new之后等于说调用了构造函数,构造函数中传的参数是一个函数,这个函数内的两个参数分别又是两个函数(reslovereject)

Promise 链 

Promise 可以通过链式调用进一步简化处理多个异步操作的代码。在 then() 方法中返回一个新的 Promise对象状态为pending,可以使得链式调用变得更加清晰。

// 假设有一个函数 fetchUserData 返回一个 Promise,用于获取用户数据
fetchUserData()
  .then((userData) => {
    // 处理获取到的用户数据
    return fetchUserPosts(userData.userId); // 返回另一个 Promise
  })
  .then((userPosts) => {
    // 处理获取到的用户发帖数据
  })
  .catch((error) => {
    console.error("处理过程中出现错误:", error);
  });

 Promise.all 

Promise.all() 用于同时处理多个 Promise,并在所有 Promise 都成功时返回一个包含所有结果的 Promise,但只要有一个 Promise 失败,它就会立即返回失败

let promise1 = someAsyncOperation();
let promise2 = anotherAsyncOperation();

Promise.all([promise1, promise2])
  .then((results) => {
    // results 包含了两个 Promise 的结果
  })
  .catch((error) => {
    // 处理失败情况
  });

Promise.race

 Promise.race() 用于竞争多个 Promise,返回一个新的 Promise,其结果由最先完成的 Promise 决定

let promise1 = fetchUserData();
let promise2 = new Promise((resolve, reject) => {
  setTimeout(() => {
    reject("操作超时!");
  }, 500); // 模拟超时操作
});

Promise.race([promise1, promise2])
  .then((result) => {
    // 处理最先完成的 Promise 的结果
  })
  .catch((error) => {
    // 处理失败情况,可能是超时或其他原因
  });

 

 

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

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

相关文章

常用的深度学习框架

深度学习作为人工智能领域的重要分支,已经广泛应用于图像识别、语音识别、自然语言处理等多个领域。为了方便研究者和开发者进行深度学习模型的构建和训练,各种深度学习框架应运而生。本文将介绍一些常用的深度学习框架,并简要分析它们的特点…

go生成terraform .tf配置

代码 package mainimport ("fmt""github.com/hashicorp/hcl/v2/hclwrite""github.com/zclconf/go-cty/cty""os""io/ioutil" )func main() {// 创建一个空的文件体系f : hclwrite.NewEmptyFile()// 创建一个body对象&#x…

【二十八】【C++】vector类的运用复习

vector类的创建 #include <iostream> using namespace std;#include <vector>void show(vector<int> vec) {if (vec.empty()) {cout << "vector is empty." ;}for (auto x : vec) {cout << x << " ";}cout << e…

AvP:水平基因转移HGT检测

帮其他人做的一个尝试&#xff0c;本身不太了解这一块&#xff0c;要是做错了请多多包涵 Home GDKO/AvP Wiki GitHub 安装AvP 数据库准备 git clone https://github.com/GDKO/AvP.git conda create --name avp conda activate avp conda install -y -c bioconda mafft bl…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:PluginComponent)

提供外部应用组件嵌入式显示功能&#xff0c;即外部应用提供的UI可在本应用内显示。 说明&#xff1a; 该组件从API Version 9开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。本组件为系统接口。 子组件 无 接口 PluginComponent(value:…

VMware Workstation Pro安装步骤教程

VMware是一款流行的虚拟机软件&#xff0c;允许用户在单一物理机上模拟多个独立的虚拟操作系统。本文将介绍如何安装VMware Workstation Pro并创建一个新的虚拟机。 一、VMware Workstation Pro安装步骤 下载VMware Workstation Pro 访问VMware官网&#xff0c;找到Workstatio…

strstr函数及其模拟实现

模拟实现的代码&#xff1a; char* my_strstr(char* p1, char* p2) {char* startp1;//记录被查找字符串的首地址char* begin p2;//记录要查找字符串的首地址while (1){while (*p1 ! *p2)//首元素不相同&#xff0c;p1向后移动一位{p1;}start p1;//找到了首元素相同的地址&am…

​如何防止网络攻击?

应对不同类型网络攻击的最佳途径是“知己”、“知彼”&#xff0c;在了解它们的工作原理、能够识别其手段、方法及意图的前提下&#xff0c;找出针对性的应对文案。今天&#xff0c;就为大家总结以下防止不同类型网络攻击的有效方法&#xff0c;希望无论是对个人、还是企业和组…

在文件夹下快速创建vue项目搭建vue框架详细步骤

一、首先在你的电脑目录下新建一个文件夹 进入该文件夹并打开控制台&#xff08;输入cmd指令&#xff09; 进入控制台后输入 vue create springboot_vue (自己指定名称) 如果出现这类报错如&#xff1a;npm install 的报错npm ERR! network request to http://registry.cnp…

Node.js 中的 HTTP 模块教程

在 Node.js 中&#xff0c;HTTP 模块是一个核心模块&#xff0c;用于处理网络请求和响应。通过 HTTP 模块&#xff0c;我们可以创建 HTTP 服务器和客户端&#xff0c;实现网络通信和数据交互。本教程将介绍如何使用 Node.js 的 HTTP 模块来创建一个简单的 HTTP 服务器。 1. 创…

Day44| 518 零钱兑换 II 377 组合总和 Ⅳ

目录 518 零钱兑换 II 377 组合总和 Ⅳ 518 零钱兑换 II class Solution { public:int change(int amount, vector<int>& coins) {//1 dp数组代表j时能凑成j的方法vector<int> dp(amount 10, 0);//2 初始化//注意本题我们凑成amount 0的方式是1种就…

Kindle刷安卓系统,安装微信读书教程

本文是由kindle第八代版本&#xff08;固件版本是5.16.2.1.1&#xff09;实践&#xff0c;根据网络资源整理而来。 一、越狱 主要参考&#xff1a;Kindle 通用越狱教程&#xff1a;适用版本小于等于 5.16.2.1.1 固件 – 书伴。 辅助参考&#xff1a;Kindle最新越狱体验&…

简单使用Xmind

xmind找不到快捷键提示&#xff0c;也没有按钮介绍&#xff0c;使用起来还得搜索一下&#xff0c;还挺麻烦的&#xff0c;如果有快捷键&#xff1a; 添加同级主题Enter添加子主题Insert / Tab删除主题Delete添加标注AltEnter主题内换行CtrlEnter拷贝CtrlC粘贴CtrlV撤销CtrlZ …

python读取大型csv文件,降低内存占用,提高程序处理速度

文章目录 简介读取前多少行读取属性列逐块读取整个文件总结参考资料 简介 遇到大型的csv文件时&#xff0c;pandas会把该文件全部加载进内存&#xff0c;从而导致程序运行速度变慢。 本文提供了批量读取csv文件、读取属性列的方法&#xff0c;减轻内存占用情况。 import pand…

setpci的掩码操作使用说明

setpci -s $BDF ECAP_ACS06.wval:mask mask为1的位将被赋值val里面的对应的位的值 例如: setpci -s $RP_BDF ECAP_ACS06.w0 setpci -s $RP_BDF ECAP_ACS06.w0x10:0x10 setpci -s $RP_BDF ECAP_ACS06.w 的值是 0x10 setpci -s $RP_BDF ECAP_ACS06.w0:0x10 setpci -s $RP_B…

力扣由浅至深 每日一题.03 罗马数字转整数

别灰心&#xff0c;好运早晚会降临的 —— 24.3.11 13. 罗马数字转整数 简单题 罗马数字包含以下七种字符: I&#xff0c; V&#xff0c; X&#xff0c; L&#xff0c;C&#xff0c;D 和 M。 字符 数值 I 1 V 5 X 10 L …

Java 包装类:原始数据类型与迭代器

Java Iterator Iterator 接口提供了一种迭代集合的方法&#xff0c;即顺序访问集合中的每个元素。它支持 hasNext() 和 next() 方法&#xff0c;用于检查是否存在下一个元素以及获取下一个元素。 获取 Iterator 可以使用集合的 iterator() 方法获取 Iterator 实例&#xff1…

纯前端Web网页内嵌AutoCAD,支持在线编辑DWG、dxf等文档。

随着企业信息化的发展&#xff0c;越来越多的企业有网页在线浏览和编辑DWG文档&#xff08;AutoCad生成的文档&#xff09;的需求&#xff0c;但是新版浏览器纷纷取消了对NPAPI插件的支持&#xff0c;导致之前一些可以在线在线浏览和编辑DWG文档纷纷失效&#xff0c;今天推荐一…

【掌握版本控制:Git 入门与实践指南】操作仓库文件|分支管理

&#x1f3ac;慕斯主页&#xff1a;修仙—别有洞天 ♈️今日夜电波&#xff1a;泥中に咲く—ウォルピスカーター 0:34━━━━━━️&#x1f49f;──────── 4:46 &#x1f504; ◀️ ⏸ ▶…

Effective C++ 学习笔记 条款25 考虑写出一个不抛异常的swap函数

swap是个有趣的函数。原本它只是STL的一部分&#xff0c;而后成为异常安全性编程&#xff08;exception-safe programming&#xff0c;见条款29&#xff09;的脊柱&#xff0c;以及用来处理自我赋值可能性&#xff08;见条款11&#xff09;的一个常见机制。由于swap如此有用&am…