iis服务器助手广告
返回顶部
首页 > 资讯 > 后端开发 > JAVA >promise.all的用法(简洁易懂)
  • 668
分享到

promise.all的用法(简洁易懂)

javascriptjava开发语言 2023-09-13 05:09:45 668人浏览 薄情痞子
摘要

Promise对象的状态改变,只有两种可能:从pending变为fulfilled和从pending变为rejected。只要这两种情况发生,状态就凝固了,不会再变了,会一直保持这个结果,这时就称为 resolved(已定型)。如果改变已经

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

promise.all()该方法用于将多个Promise实例,包装成一个新的Promise实例。

   var p=Promise.all([p1,p2,p3]);


(1)只有p1、p2、p3的状态都变成fulfilled,p的状态才会变成fulfilled,此时p1、p2、p3的返回值组成一个数组,传递给p的回调函数。

(2)只要p1、p2、p3之中有一个被rejected,p的状态就变成rejected,此时第一个被reject的实例的返回值,会传递给p的回调函数。

promise.all()

 比如当数组里的P1,P2都执行完成时,页面才显示。
 值得注意的是,返回的数组结果顺序不会改变,即使P2的返回要比P1的返回快,顺序依然是P1, P2

    Promise.all成功返回成功数组,失败返回失败数据,一但失败就不会继续往下走

let p1 = new Promise((resolve, reject) => {  resolve('成功了')})let p2 = new Promise((resolve, reject) => {  resolve('success')})let p3 = Promse.reject('失败')Promise.all([p1, p2]).then((result) => {  console.log(result)               //['成功了', 'success']}).catch((error) => {  console.log(error)})Promise.all([p1,p3,p2]).then((result) => {  console.log(result)}).catch((error) => {  console.log(error)      // 失败了,打出 '失败'})
let wake = (time) => {  return new Promise((resolve, reject) => {    setTimeout(() => {      resolve(`${time / 1000}秒后醒来`)    }, time)  })}let p1 = wake(3000)let p2 = wake(2000)Promise.all([p1, p2]).then((result) => {  console.log(result)       // [ '3秒后醒来', '2秒后醒来' ]}).catch((error) => {  console.log(error)})需要特别注意的是,Promise.all获得的成功结果的数组里面的数据顺序和Promise.all接收到的数组顺序是一致的,即p1的结果在前,即便p1的结果获取的比p2要晚。这带来了一个绝大的好处:在前端开发请求数据的过程中,偶尔会遇到发送多个请求并根据请求顺序获取和使用数据的场景,使用Promise.all毫无疑问可以解决这个问题。
注意:如果作为参数的 Promise 实例,自己定义了catch方法,那么它一旦被rejected,并不会触发Promise.all()的catch方法。示例代码:const p1 = new Promise((resolve, reject) => {  resolve('hello');}).then(result => result).catch(e => e);const p2 = new Promise((resolve, reject) => {  throw new Error('报错了');}).then(result => result).catch(e => e);Promise.all([p1, p2]).then(result => console.log(result)).catch(e => console.log(e));// ["hello", Error: 报错了]p1会resolved,p2首先会rejected,但是p2有自己的catch方法,该方法返回的是一个新的 Promise 实例,p2指向的实际上是这个实例。该实例执行完catch方法后,也会变成resolved,导致Promise.all()方法参数里面的两个实例都会resolved,因此会调用then方法指定的回调函数,而不会调用catch方法指定的回调函数。而如果p2没有自己的catch方法,就会调用Promise.all()的catch方法。如下:const p1 = new Promise((resolve, reject) => {  resolve('hello');}).then(result => result);const p2 = new Promise((resolve, reject) => {  throw new Error('报错了');}).then(result => result);Promise.all([p1, p2]).then(result => console.log(result)).catch(e => console.log(e));// Error: 报错了

promise.race( )

Promise.race是赛跑的意思,也就是说Promise.race([p1, p2, p3])里面的结果哪个获取的快,就返回哪个结果,不管结果本身是成功还是失败

 使用场景: Promise.all和Promise.race都是有使用场景的。 有些时候我们做一个操作可能得同时需要不同的接口返回的数据,这时我们就可以使用Promise.all; 有时我们比如说有好几个服务器的好几个接口都提供同样的服务,我们不知道哪个接口更快,就可以使用Promise.race,哪个接口的数据先回来我们就用哪个接口的数据

let p1 = new Promise((resolve, reject) => {  setTimeout(() => {    resolve('success')  },1000)})let p2 = new Promise((resolve, reject) => {  setTimeout(() => {    reject('failed')  }, 500)})Promise.race([p1, p2]).then((result) => {  console.log(result)}).catch((error) => {  console.log(error)  // 打开的是 'failed'})


下面来看几个简洁易懂的例子:

1.await 可以获得多个promise 的返回结果

2. Promise.all 返回的也是promise,所以可以直接await Promise.all();

1. 使用Promise

function fn(){    return new Promise((resolve,reject)=>{        let randomNum = parseInt(Math.random()*6+1);        console.log(randomNum);        if(randomNum>3){            resolve('买');         }        else{            reject('不买');        }    })}Promise.all([fn(),fn()]).then(  (x)=>{console.log(x,'success')},(y)=>{console.log(y,'error');});

Promise.all 里面参数为一个数组,数组的每一项是一个返回promise 的函数调用
then 的第一个参数是所有promise都成功的调用,返回结果是一个数组,数组的每一项为函数promise 的返回结果。
then 的第二个参数:返回结果有一个失败则执行失败的回调,拿到的是第一个失败的值
2. 使用await

await 是可以获得多个promise 返回结果的,Promise.all()返回的也是promise结果。所以想要使用await 拿到多个promise的返回值,可以直接await Promise.all();

function fn(){    return new Promise((resolve,reject)=>{        let randomNum = parseInt(Math.random()*6+1);        console.log(randomNum);        if(randomNum>3){            resolve('买');         }        else{            reject('不买');        }    })}async function test(){    try{    let res = await Promise.all([fn(),fn()]);    console.log(res,'success');    }    catch(error){        console.log(error,'error');    }}test();


Promise.all([fn(),fn()]) 都返回resolve(); 才能够拿到成功的返回值
Promise.all([fn(),fn()]) 有一个返回reject(), 则进入catch(error), 拿到失败的返回值


 

来源地址:https://blog.csdn.net/weixin_62765236/article/details/127018532

--结束END--

本文标题: promise.all的用法(简洁易懂)

本文链接: https://www.lsjlt.com/news/405479.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • promise.all的用法(简洁易懂)
    Promise对象的状态改变,只有两种可能:从pending变为fulfilled和从pending变为rejected。只要这两种情况发生,状态就凝固了,不会再变了,会一直保持这个结果,这时就称为 resolved(已定型)。如果改变已经...
    99+
    2023-09-13
    javascript java 开发语言
  • Golang之美:简洁易懂的代码
    标题:Golang简洁之美:代码简单易懂 Go语言(Golang)自诞生以来便以其简洁、高效的特点受到了广泛青睐。作为一门静态类型的编程语言,Go语言在语法设计上追求简单、清晰,鼓励开...
    99+
    2024-02-25
    golang 简洁 易懂 go语言
  • get请求和post请求的区别(简洁易懂)
    一.GET和POST是什么 HTTP协议中的两种发送请求的方法,本质上都是在进行TCP连接. 二. GET请求和POST请求的区别是什么 GET请求参数是通过URL进行传递的,POST请求的参数包含在请求体当中。 GET请求比POST请求更...
    99+
    2023-08-31
    服务器 运维
  • 【黄啊码】PHP压缩图片(简洁易懂版,不懂我下次不写)
    大家好,我是黄啊码,今天我们来解决一件头疼的事情。作为技术人员,我们一般传图片都知道尽量传清晰和大小适中的图片,部署的时候当然也希望客户能按说明办事,但有的客户偏偏不听,就传大的,就传大的,最终后宫服务器三千都顶不住他们的折腾,程序员心里苦...
    99+
    2023-09-07
    php 开发语言
  • 简单易懂的Flask应用部署方法
    简单易懂的Flask应用部署方法 引言:Flask是一个简单易用的Python web框架,它可以帮助开发者快速构建web应用程序。但是,仅仅在本地运行Flask应用是不够的,我们还需要将应用部署到服务器上,让更多用户可以访问我...
    99+
    2024-01-19
    Flask 应用部署 简单易懂
  • 简单易懂Java反射的setAccessible()方法
    目录概要一、 什么是Java的访问检查二、 setAccessible() 方法介绍前言:在使用Field类的对象访问我自定义的Employee类对象的name域时,抛出异常ille...
    99+
    2024-04-02
  • 关于@RequestParam注解的使用(简单易懂)
    目录@RequestParam注解使用1、作用2、语法3、测试环境4、工程结构5、业务处理器HelloController.java6、测试@RequestParam与@Param区...
    99+
    2024-04-02
  • 揭示Go语言的优点:简洁易学的语法秘密
    Go语言优势揭秘:简洁易学的语法 Go语言,又称Golang,是一种开源的、编译型、静态强类型的编程语言。它由谷歌于2007年开发,并于2009年正式发布。Go语言因其简洁易学的语法、高效的编译速度、强大的并...
    99+
    2024-01-31
    语法 go语言优势 简洁易学 go语言
  • golang的语法简洁吗
    这篇文章主要介绍“golang的语法简洁吗”,在日常操作中,相信很多人在golang的语法简洁吗问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”golang的语法简洁吗”的疑惑有所帮助!接下来,请跟着小编一起来...
    99+
    2023-07-04
  • 超简单易懂的vue组件传值
    目录前言实现思路实例1:父传子实例2:子传父总结前言 vue中的组件传值大家应该都不陌生,今天用两个简单易懂的小案例教大家在项目中如何使用父传子、子传父组件之间的数据传递。 实现思路...
    99+
    2024-04-02
  • PHP Mail 用法指南:简单易懂的邮件发送教程
    PHP是一种广泛应用于开发Web应用程序的脚本语言,它提供了许多用来处理邮件发送的功能。本文将向大家介绍PHP中如何使用邮件发送功能,同时提供具体的代码示例。 一、准备工作 在使用PH...
    99+
    2024-04-02
  • c/c++基础简单易懂的快速排序算法
    快速排序就是找一个基准,然后其左边要比他小,右边要比他大 int partition(int* a, int left, int right) { int pivot = le...
    99+
    2024-04-02
  • SpringBoot自动配置原理,你真的懂吗?(简单易懂)
    概述 上面博文(SpringBoot简介与快速搭建)我们简单的介绍了什么是SpringBoot,以及如何使用SpringBoot,但是我们对于SpringBoot的基本原理并没有介绍...
    99+
    2024-04-02
  • WordPress入门指南:简单易懂的介绍
    随着互联网的不断发展,搭建个人博客或企业网站已经变得越来越简便易行。而在众多网站搭建工具中,WordPress作为一个内容管理系统,备受青睐。本文将为大家提供一个WordPress入门...
    99+
    2024-02-29
    指南 入门
  • Golang错误处理简明指南:易学易懂的指导
    在软件开发中,错误处理是一项至关重要的工作。良好的错误处理能够帮助开发者及早发现问题、提升代码健壮性,同时也能为用户提供更好的体验。本文将重点介绍在Go语言(Golang)中的错误处理...
    99+
    2024-02-26
    教程 golang 错误处理 go语言 数据丢失
  • Python中的多线程实例(简单易懂)
    目录1.python中显示当前线程信息的属性和方法2.添加一个线程3.线程中的join函数4.使用Queue存储线程的结果5.线程锁lock前言: 多线程简单理解就是:一个CPU,也...
    99+
    2024-04-02
  • 简明易懂:Python中的分支与循环
    文章目录 前言分支结构if 语句:单一条件判断else语句:提供备选方案elif 语句:多条件判断嵌套的分支结构:复杂条件逻辑 循环结构for循环:遍历序列range()函数与for循环...
    99+
    2023-09-08
    python 开发语言 学习
  • 简单易懂的numpy版本查看指南
    NumPy是Python中一个重要的科学计算包,它提供了许多数学相关的功能,在数据分析、机器学习、深度学习等领域被广泛应用。在 NumPy 中,数组(array)是主要的数据结构,而数组的操作是 NumPy 最核心的功能之一。 ...
    99+
    2024-01-19
    指南 Numpy 查看
  • 简明易懂的Linux CentOS PHP7安装教程
    Linux CentOS系统是一种广泛使用的操作系统,而PHP7又是一种常见的服务器端脚本语言。将它们结合起来,可以实现许多强大的网络应用。本文将向您介绍如何在Linux CentOS...
    99+
    2024-03-07
    linux php centos php脚本
  • 简单易懂的Dedecms删除栏目教程
    Dedecms 是一款常用的开源内容管理系统,但是对于一些新手可能会有些难以理解的功能操作,比如删除栏目。今天我们就来教大家如何简单易懂地删除 Dedecms 中的栏目。 首先,需要登...
    99+
    2024-03-15
    教程 dedecms 删除栏目 数据丢失
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作