Promise.all()使用场景

选中文字可对指定文章内容进行评论啦,→和←可快速切换按钮,绿色背景文字可以点击查看评论额。

Promise.all()使用场景

在上一节我们介绍了Promise.all()怎么样使用,这一部分我们思考一下什么场景下使用这个方法呢?

在等待多个Promise 完成的任何情况下,您都需要使用 Promise.all(),并且任何一次失败都会导致整个操作失败。 以下是 Promise.all() 的一些常见用例。

一起处理多个文件

在使用服务端 JavaScript 运行时(例如 Node.js 或 Deno)时,您可能需要读取多个文件并且处理其中包含的数据。 在这种情况下,并行读取文件并等到它们都被读取后再继续处理您检索到的数据是最有效的。
这是一个适用于 Node.js 的示例:

import { readFile } from "node:fs/promises";

function readFiles(filenames) {
  return Promise.all(
    filenames.map(filename => readFile(filename, "utf8"))
  );
}

readFiles([
  "file1.json",
  "file2.json"
]).then(fileContents => {

  // parse JSON data
  const data = fileContents.map(
    fileContent => JSON.parse(fileContent)
  );

  // process as necessary
  console.log(data);

}).catch(reason => {
  console.error(reason.message);
});

此示例使用基于 Node.js Promise的文件系统 API 来并行读取多个文件。 readFiles() 函数接受要读取的文件名数组,然后将每个文件名映射到由导入的 readFile() 函数创建的Promise。该文件被读取为文本(如作为第二个参数传递的“utf8”编码所示),结果在fullfilment handler中作为 fileContents 数组可用,数组中包含每个文件名对应的文本。 文件文本内容将作为 JSON 解析到数组中,然后传递给 processData() 函数。 这是跨多个文件处理数据的常用方法,因为如果无法读取或解析任何一个文件,则操作无法正确完成并应停止。

 

调用多个Web 服务 API

Promise.all() 的另一个常见用例是调用多个 Web 服务 API 时。 这在 REST API 中尤为常见,其中与实体关联的每种类型的数据都可能有自己的端点。 例如,考虑一个应用程序,其中每个用户都有博客文章和相册,您可能需要在用户的个人资料中收集所有这些信息。 代码可能如下所示:

const API_BASE = "https://jsonplaceholder.typicode.com";

function fetchUserData(userId) {

  const urls = [
    `${API_BASE}/users/${userId}/posts`,
    `${API_BASE}/users/${userId}/albums`
  ];

  return Promise.all(urls.map(url => fetch(url)));
}

fetchUserData(1).then(responses => {
  return Promise.all(
    responses.map(
      response => {
        if (response.ok) {
          return response.json();
        } else {
          return Promise.reject(
            new Error(`Unexpected status code: ${response.status} ${response.statusText} for ${response.url}`)
          );
        }
      }
    )
  );
}).then(([posts, albums]) => {

  // process your data as necessary
  console.log(posts);
  console.log(albums);

}).catch(reason => console.error(reason.message));

此示例使用 JSONPlaceholder¹ 服务,这是一个免费的虚假 API,用于测试和原型设计。 给定一个特定的用户 ID,JSONPlaceholder 将生成假数据。 在这种情况下,代码为每个用户提供/posts和/albums 端点。 fetchUserData() 函数接受用户 ID 并生成要调用的 URL。 然后将 URL 映射到每个 fetch() 调用返回的Promise。 当检索到响应时,另一个 Promise.all() 调用用于将每个响应映射到另一个 Promise,如果响应在 200-299 范围内,则为 JSON 正文,否则为拒绝的 Promise(这将使整个操作调用rejection handler)。 在最后一个settlement handler中,可以处理帖子和相册数据。

版权声明:著作权归作者所有。

相关推荐

配置Eclipse使用Java9

Oxygen 4.7.1aEclipse Oxygen 4.7.1a已经支持Java 9启动,以及支持Java 9的开发,直接安装Eclipse Oxygen 4.7.1a即可,不需要特别的配置。但运行可能会出现一些环境问题,也可以按以下配置eclipse.ini指定Java 9的vm-vm C:\Program&nb

Python3.5使用subprocess.run调用外部程序

Python 3.5的subprocess模块新增了run()函数,大部分调用子进程的场景都推荐使用run()函数,一些高级的用法则可以直接调用Popen 接口。run()函数run函数常用参数如下:run(args, *, stdin=None, input=None, stdout=None, stderr=None, shell=False, cwd=None, timeout=N

java.util.Objects的使用

java.utils.Objects针对Object对象提供了几个静态的工具方法,这些方法可以归类为:null安全检查对象比较计算对象hash code对象转换为Stringnull安全检查null安全检查有5个方法:isNull(Object obj):检查对象是否为null,null返回true,否则返回falsenonNull(Object obj):与isNu

使用Webpack、TypeScript 和React搭建应用

这里简单介绍基于webpack + typescript + react搭建一个应用。初始化项目创建一个空文件夹demo,使用npm在空文件夹初始化项目。npm init npm install --save-dev webpack npm install --save-dev types

RabbitMQ使用rabbitmqctl添加用户管理

rabbitmqctrl是RabbitMQ的管理工具,在RabbitMQ安装目录的sbin下。虚拟主机管理添加虚拟主机rabbitmqctl add_vhost <vhost> 删除虚拟主机rabbitmqctl delete_vhost <vhost>用户管理 添加用户rabbitmqctl add_user <username> <

TensorFlow2 tf.dataset的使用

这个笔记主要是TensorFlow 2.0的tf.dataset接口的使用。下面的示例会把numpy array的数据写入到TFRecord文件中,以及从TFRecord文件中读取数据到numpy array。安装可以参考官网的https://www.tensorflow.org/install教程来安装。安装完成后,检查安装的TensorFlow的版本:import tensorflow as

SwiftUI Alerts的使用示例

SwiftUI里的Alerts可以分为三类:警告对话框(Alert Dialogs)操作列表(Action Sheets)弹窗(Popovers)警告对话框(Alert Dialogs)示例使用SwiftUI,我们可以很容易地使用声明的方式来创建警告框以及定义操作,示例如下:struct AlertView: View { @State private var showingAlert =

.NET Core 3 System.Text.JSON的使用

ASP.NET Core 3.0引入了原生支持处理json的Sytem.Text.Json,替换了之前的Newtonsoft.Json。如果项目中使用的是.NET Standard或者.NET framework(v4.6.1+),如果想使用System.Text.Json,则需要安装System.Text.Jsonde NuGet包。添加Namespaces使用System.Text.Json首

Linux下gcc的使用

在Linux系统中,可执行文件没有统一的后缀,系统从文件的属性来区分可执行文件和不可执行文件.而gcc则通过后缀来区别输入文件的类别,下面介绍gcc所遵循的部分约定规则. .c为后缀的文件,是C语言源代码文件; .a为后缀的文件,是由目标文件构成的库文件; .C,.cc,.cxx为后缀的文件,是C++源代码文件; .h为后缀的文件,是程序所包含的头文件; .i为后缀的文件

Angular集成moment.js使用

moment.js是一个专门用于处理时间的包。可以通过下面的方法把moment.js集成到Angular中使用。一、使用npm安装moment.jsnpm install --save moment二、在使用moment.js的.ts文件中导入import * as moment from 'moment'; 三、使用moment.jsmyDate = moment(someDate).