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

目录

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

异步

 let a = 0setTimeout(() => {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 = 0new Promise((resolve, reject) => {setTimeout(() => {a = 1resolve()}, 1000)}).then(() => {console.log(a) //1}).catch(() => {}
)

Promise可进行连续回调

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

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

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

let a = 0new Promise((resolve, reject) => {setTimeout(() => {a = 1resolve(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 = 0new Promise((resolve, reject) => {setTimeout(() => {a = 1resolve(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 = 0const res = await new Promise((resolve, reject) => {setTimeout(() => {a = 1resolve(a)}, 1000)})console.log(res) //1}test()

总结

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

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

参考文档:

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

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

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

相关文章

Halcon 协同机械手进行自动标定

流程 使用相机捕捉初始标定点位,记录世界坐标 在机器人示教器上基于基准点位进行其余8个点位设置,每次x轴偏移4 或 Y轴偏移4 对每个点位进行图像获取 编写Halcon脚本,获取9幅图像中点位中心的像素坐标,以及对应算出的…

还在愁没项目?来瞧瞧这些另类赚钱方式

客套话不多说,直接上案例,这些都是正儿八经的真实案例,相信大家通过这些人的案例自然能摸索整理出一套属于自己的项目!摸索不出,也多多少少能受一些灵感上的启发。 小A是长期混B站的,大家称他为“B站搬运工…

vscode插件问题

1 Vscode code颜色变化 最外层标签颜色变成白色 其他标签有颜色,css代码颜色有些变成白色 是安装的另一个插件vue影响的,卸载就能恢复正常的颜色 2 配置Vue项目的代码片段 css 样式代码片段 配置css.json上后偶尔能用偶尔不能用,Vscode 右下…

css浮动属性学习

在此文, html菜单的基本制作-CSDN博客 已经看到css 浮动属性的效果;下面单独看一下浮动属性; 做4个div,设置不同的背景色,不为div添加float属性;效果如下; 因为div是块级元素,默认…

【Openstack Train安装】十三、创建实例

在先前的教程中,介绍了安装openstack及其相关组件的具体过程,本文介绍如何创建实例并完成访问。 在按照本教程操作之前,请确保完成以下配置: 【Openstack Train安装】一、虚拟机创建 【Openstack Train安装】二、NTP安装 【Op…

UG\NX二次开发 创建对象属性UF_ATTR_set_user_attribute

文章作者:里海 来源网站:里海NX二次开发3000例专栏 简介 创建对象属性UF_ATTR_set_user_attribute,这是一个新函数用于替代UF_ATTR_assign,旧版本NX是用UF_ATTR_assign函数创建、更新属性值,请参照这篇文章《UG\NX二次开发 创建对象属性UF_ATTR_assign》 下面是这个新函数…

虚幻学习笔记7—蓝图接口

一、前言 蓝图接口就是可以在蓝图中实现的接口,有它方便的地方,可以很方便的调用到实现了接口的函数。 二、实现 2.1、创建一个蓝图接口 1)可以添加多个函数。 2)函数在蓝图接口中只能规定输入和输出参数。 只有输入参数的可以…

什么是API? (应用程序编程接口)

我们经常听到 API 这个专业名称。那么什么是 API 呢? 定义 API(Application Programming Interface,应用程序接口)是一些预先定义的函数,或指软件系统不同组成部分衔接的约定。目的是提供应用程序与开发人员基于某软…

Linux实现类似cp的命令

1.利用主函数的三个函数进行传参 1).主函数的三个参数的含义: argc:主函数的参数个数 argv:主函数的参数内容 envp:环境变量; 2).演示代码: #include <stdio.h> #include <stdlib.h> #include <unistd.h> int main(int argc,char *argv[],char *envp[]…

《微信小程序开发从入门到实战》学习三十七

4.2 云开发JSON数据库 4.2.8 分页查询 在计算机互联网时代&#xff0c;很多页面底部分页导航按钮&#xff0c;有首页、上一页、第一页、第二页、尾页。 分页查询是指根据页码将每一页的数据查询出来。 在移动互联网时代&#xff0c;网页和应用都对网页进行优化&#xff0c;…

C/C++ Zlib库封装MyZip压缩类

Zlib是一个开源的数据压缩库&#xff0c;提供了一种通用的数据压缩和解压缩算法。它最初由Jean-Loup Gailly和Mark Adler开发&#xff0c;旨在成为一个高效、轻量级的压缩库&#xff0c;其被广泛应用于许多领域&#xff0c;包括网络通信、文件压缩、数据库系统等。其压缩算法是…

搜维尔科技:Varjo XR-4 系列-专为极致沉浸感而打造!

Varjo 的新一代头显将世界上最先进的混合现实技术与顶尖的图形处理能力连接起来&#xff0c;满足最高级别的视觉保真度和沉浸感至关重要的工业用例。 光学设计的根本性突破 体验全新的沉浸感。大幅扩展的视野&#xff0c;跨越 120 x 105 度&#xff0c;打破了受人尊敬的“全双眼…