【JS Promise, Promise.all 与 async/await用法详解】

目录

    • Promise
    • Promise基本使用
    • Promise可进行连续回调
    • Promise回调可接受入参
      • 1.工作原理
    • async/await
    • 总结
      • 参考文档:

异步

 let a = 0

    setTimeout(() => {
      a = 1
    }, 1000)
    
    console.log(a) // 0

此时这个延迟就成为异步执行的了,a值还没有变1就被使用输出,我们只能得到0。

Promise

有时候我们不得不进行异步操作,比如从后台请求数据,我们需要时间,等待它得到数据后再使用。

Promise基本使用

new Promise()内接收一个函数,入参为resolve, reject

Promise内的函数将可以执行任意时长,执行到调用resolve()reject(),我们此处把它放在延迟1s后执行,此时a已经被赋值为1,因此就可以得到被赋值后的a。

**resolve()**进入.then也就是执行成功回调,**reject()**进入.catch也就是手动执行错误进入捕获异常,reject()用的较少。

let a = 0

new Promise((resolve, reject) => {
      setTimeout(() => {
        a = 1
        resolve()
      }, 1000)
    })
      .then(() => {
        console.log(a) //1
      })
      .catch(() => {}
)

Promise可进行连续回调

  1. 第一种方式,回调函数中接受返回一个新的Promise进行下一步回调。

  2. 第二种方式,Promise.resolve(res)在res为普通数据时等同于new Promise并且resolve(res)

  3. 第三种也是最常用的,再异步回调中直接返回普通数据也可当作接受了一个新的Promise进行下一步回调

let a = 0

    new Promise((resolve, reject) => {
      setTimeout(() => {
        a = 1
        resolve(a)
      }, 1000)
    })
      .then((res) => {
        return new Promise((resolve, reject) => {
          resolve(res)
        })
        //等同于
        //return Promise.resolve(res)
        //等同于
        //return res
      })
      .then((res) => {
        console.log(res) //1
      })
      .catch(() => {})

Promise回调可接受入参

  1. .then中的回调函数可以存在入参,入参为**resolve()**手动传入,此处res便是传入的a值。
  2. .catchreject()的关系与上面两者同理,只不过变成了手动捕捉错误时的回调。
 let a = 0

    new Promise((resolve, reject) => {
      setTimeout(() => {
        a = 1
        resolve(a)
      }, 1000)
    })
      .then((res) => {
        console.log(res) //1
      })
      .catch(() => {})

Promise.all(promises) ,能够一次并行处理多个 promise,并且只返回一个 promise 实例, 那个输入的所有 promiseresolve 回调的结果是一个数组。

1.工作原理

Promise.all() 是一个内置的辅助函数,接受一组 promise(或者一个可迭代的对象),并返回一个promise :
ini复制代码const allPromise = Promise.all([promise1, promise2, …]);

可以使用 then 方法提取第一个 promise 的值:

allPromise.then((values) => {
    values; // [valueOfPromise1, valueOfPromise2, ...]
});

也可以使用 async/await 语法:

const values = await allPromise;
console.log(values); // [valueOfPromise1, valueOfPromise2, ...]

Promise.all() 返回的 promise 被解析或拒绝的方式。
如果 allPromise 都被成功解析,那么 allPromise 将使用一个包含各个 promise 已执行完成后的值的数组作为结果。数组中 promise 的顺序是很重要的——将按照这个顺序得到已实现的值。
在这里插入图片描述
但是如果至少有一个 promise 被 rejected ,那么 allPromise 会以同样的原因立即 rejected (不等待其他 promise 的执行)。
在这里插入图片描述

如果所有的 promise 被 rejected ,等待所有的promise 执行完成,但只会返回最先被rejected 的promise 的 reject 原因。
在这里插入图片描述
具体使用可以参考: https://juejin.cn/post/7003713678419705870

Promise.all() 的这种行为被称为快速失败,如果 promise 数组中至少有一个 promise 被 rejected ,那么返回的 promise 也被拒绝。如果promise 数组中所有的都被 rejected ,那么返回的promise 被拒绝的原因是先rejected的那一个。

Promise.all() 是并行执行异步操作并获取所有 resolve 值的最佳方法,非常适合需要同时获取异步操作结果来进行下一步运算的场合

async/await

Promise是用来解决回调地域问题,因此es7出现了async/await,是Promise的语法糖,等同于Promise的链式调用+ Exception处理。

async/await有一个限制就是必须在函数中使用,因此我们将代码包进一个函数,并在函数前加上async这样我们便可以在函数中使用await关键字

const test = async () => {
      let a = 0
      ...
    }
    
    test()

await用在哪里呢?用在.then回调前的Promise

await后面跟着Promise,而它的返回值便是回调时resolve()传来的值,代替了回调函数,看起来代码一下子就清晰很多了。

const test = async () => {
      let a = 0

      const res = await new Promise((resolve, reject) => {
        setTimeout(() => {
          a = 1
          resolve(a)
        }, 1000)
      })

      console.log(res) //1
    }
    
    test()

总结

  • Promise 是一种更底层的异步编程模型,而 async/await 则是基于 Promise 的语法糖,使异步代码更加清晰易读。

  • 在实际使用中,async/await 更容易理解和维护,但它们本质上仍然依赖于 Promise。

参考文档:

  • https://juejin.cn/post/7078882164032421924
  • https://juejin.cn/post/7003713678419705870

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

BLP9H10-30GZ LDMOS 功率晶体管 Ampleon

BLP9H10-30GZ 30W塑料LDMOS 功率晶体管,适用于频率范围为616 MH 至960 MHz的基站应用。 BLP9H10-30GZ 特点和优势: 高效率 出色的耐用性 专为宽带操作而设计 出色的热稳定性 高功率增益 集成ESD保护 有关 RoHS 合规性 BLP9H10-30GZ应用程序&…

上海震坤行被评为虹桥生产线互联网服务高质量发展平台

上海震坤行被评为虹桥生产线互联网服务高质量发展平台 10月12日,新一期“潮涌浦江投资虹桥”活动暨“战略赋能新机遇,开放引领新高地”——2023虹桥国际中央商务区投资促进大会在上海虹桥举行。 本次活动旨在释放关于推动虹桥国际开放枢纽进一步提升能级…

matplotlib与opencv图像读取与显示的问题

个人博客:Sekyoro的博客小屋 个人网站:Proanimer的个人网站 最近在用opencv和matplotlib展示图片,但是遇到了一些问题,这里展开说说 首先需要明确的是,opencv和matplotlib读取图片都是通道在最后,而前者默认可见光图像是BGR,后者是RGB.此外还有PIL以及imageio等读取图像的工具…

东明石化集团领导团队参访震坤行工业超市

东明石化集团领导团队参访震坤行工业超市 10月16日,山东东明石化集团(以下简称东明石化)总裁李治先生一行带队来访参观交流震坤行,与震坤行工业超市董事长兼CEO陈龙、销售负责团队开展座谈。期间,双方就企业数字化转型…

图扑软件受邀出席高交会-全球清洁能源创新博览会

“相聚鹏城深圳,共享能源盛宴” 第二十五届中国国际高新技术成果交易会(简称“高交会”)于 11 月 15-18 日在深圳盛大开幕。高交会由商务部、科学技术部、工业和信息化部、国家发展改革委、农业农村部、国家知识产权局、中国科学院、中国工程院和深圳市人民政府共同…

C#图像处理OpenCV开发指南(CVStar,04)——图片像素访问与多种局部放大效果的实现代码

​​​​​​​ 使用本文代码需要预先设置一点开发环境,请阅读另外一篇博文: C#图像处理OpenCV开发指南(CVStar,03)——基于.NET 6的图像处理桌面程序开发实践第一步https://blog.csdn.net/beijinghorn/article/deta…

ESP32-Web-Server编程- WebSocket 编程

ESP32-Web-Server编程- WebSocket 编程 概述 在前述 ESP32-Web-Server 实战编程-通过网页控制设备的 GPIO 中,我们创建了一个基于 HTTP 协议的 ESP32 Web 服务器,每当浏览器向 Web 服务器发送请求,我们将 HTML/CSS 文件提供给浏览器。 使用…

[Linux] linux防火墙

一、防火墙是什么 防火墙(FireWall):隔离功能,工作在网络或主机的边缘,数据包的匹配规则与由一组功能定义的操作组件处理的规则相匹配,根据特定规则检查网络或主机的入口和出口 当要这样做时,基…

EXCEL一对多关系将结果合并到一个单元格

EXCEL一对多关联结果,合并到1个单元格,变成一对一 需求说明 举例说明 假设给出国家省和国家市的对应表,因为每个省都有很多个城市(如图1,截取了部分),属于一对多的情况; 如何将同…

数据清洗和特征工程的关系是什么?有什么区别?

1.数据清洗独立于特征工程 数据清洗是独立于特征工程的:一方面,数据清洗不仅适用于机器学习项目,也适用于一般的数据统计分析过程,而特征工程仅适用于机器学习项目;另一方面,针对机器学习项目,…

小程序云开发中引入vant

首先看一下云开发中的小程序的目录结构 安装 vant 上面是官方的方法 具体到我们的项目是这样子的 最后,构建一下就可以了

Stable Video Diffusion(SVD)参数使用教程

Stable Video Diffusion(SVD)安装和测试 官网 github | https://github.com/Stability-AI/generative-modelsHugging Face | https://huggingface.co/stabilityai/stable-video-diffusion-img2vid-xtPaper | https://stability.ai/research/stable-vid…

今年全国收缴各类假章假证1200余万枚!契约锁为组织防范萝卜章

近期公安部召开新闻发布会并通报:今年以来,全国立案侦办假章假证犯罪案件7700余起,收缴各类假章假证1200余万枚。 (截图自国家公安部官网) 印章作为国家机关依法行政和企事业单位依法从事生产活动的重要信用凭证&…

ACM32F070 RTC 引脚做普通 GPIO 用法配置

有场景需要把带RTC引脚功能的IO当做普通的GPIO使用,但是按照正常的GPIO初始化却无法使用,该芯片手册中有给出介绍 现给出配置方法,参考官方SDK里面PC13的配置: // PC13 GPIOC_Handle.Pin GPIO_PIN_13; GPIOC_Handle.Mod…

C++基础 -21-多继承与多级继承

多继承 代码示例 #include "iostream"using namespace std;class base1 { public:base1() {}base1(int a, int b) : a(a), b(b) {}int a;protected:int b; };class base2 { public:base2() {}base2(int a, int b) : c(a), d(b) {}int c;protected:int d; };class …

springboot+netty化身Udp服务端,go化身客户端模拟设备实现指令联动

🎏:你只管努力,剩下的交给时间 🏠 :小破站 springbootnetty化身Udp服务端,go化身客户端模拟设备实现指令联动 🔗涉及链接前言异步通信的优势异步通信的优势:异步通信的应用场景&…

SD-WAN是否将终结IPsec VPN?

在网络架构的演进历程中,IPsec VPN一直扮演着至关重要的技术角色。而近年来备受关注的SD-WAN技术日益成熟,各大服务供应商纷纷将其与IPsec VPN进行对比,似乎预示着SD-WAN必然替代传统的IPsec VPN。 然而事实究竟如何?SD-WAN等于IP…

Node.js 万字教程

0. 基础概念 Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,使用了一个事件驱动、非阻塞式 I/O 模型,让 JavaScript 运行在服务端的开发平台。 官方地址:https://nodejs.org/en 中文地址:https://nodejs.org/zh-cn 代…

leetcode 18. 四数之和(优质解法)

代码&#xff1a; class Solution {public List<List<Integer>> fourSum(int[] nums, int target) {List<List<Integer>> listsnew ArrayList<>();int lengthnums.length;Arrays.sort(nums);for(int i0;i<length-4;){for(int ji1;j<lengt…