[翻译] Javascript: 如何访问Promise对象返回值

news/2025/3/11 8:17:34/文章来源:https://www.cnblogs.com/klchang/p/18764087

在Javascript中,什么是Promise

Promise是一个对象,表示一个异步操作的事件完成或失败。

Promise对象可以是如下状态:

  • pending
  • fulfilled
  • rejected

最广泛使用的异步操作的一个实例是Fetch API。fetch() 方法返回一个Promise对象。

如果我们从后端API获取一些数据。对于这篇博文,我将使用JSONPlaceholder – 一个伪造的REST API。我们将获取一个id=1的用户数据。

fetch("https://jsonplaceholder.typicode.com/users/1")

让我们看看如何访问返回数据。

1- then() 链式操作

它是最简单和最明显的方式。

fetch("https://jsonplaceholder.typicode.com/users/1") // 1.then((response)=>response.json())  //2.then((user) => {console.log(user.address); // 3});

这里,我们(1)从API获取数据,(2)转换为JSON对象,然后(3)打印用户地址值到控制台。

结果如下:

{street: 'Kulas Light',suite: 'Apt. 556',city: 'Gwenborough',zipcode: '92998-3874',geo: { lat: '-37.3159', lng: '81.1496' }
}

2- 在之后的代码中使用返回值

但是如果我们想要在之后的代码中使用返回值,怎么办?

如果我们尝试像这样做(错误方式!

const address = fetch("https://jsonplaceholder.typicode.com/users/1").then((response)=>response.json()).then((user) => {return user.address;});console.log(address);

我们将得到

Promise { <pending> }

得到这种结果,是因为Javascript代码总是同步执行,所以console.log()函数在fetch()请求后立即开始,而没有等待直到它解析完成。当console.log()函数开始运行的时刻,fetch()请求函数返回的Promise对象处于pending状态。

那就是说,我们可以访问另一个 .then() 回调函数的Promise对象的返回值:

const address = fetch("https://jsonplaceholder.typicode.com/users/1").then((response) => response.json()).then((user) => {return user.address;});const printAddress = () => {address.then((a) => {console.log(a);});
};printAddress();

或使用async/await语法:

const address = fetch("https://jsonplaceholder.typicode.com/users/1").then((response) => response.json()).then((user) => {return user.address;});
const printAddress
= async () => {const a = await address;console.log(a); };
printAddress();

以这两种方式,我们将得到:

{street: 'Kulas Light',suite: 'Apt. 556',city: 'Gwenborough',zipcode: '92998-3874',geo: { lat: '-37.3159', lng: '81.1496' }
}

结论

Promise对象广泛用于Javascript异步编程。而且开发者对于如何正确使用它,有时还有些困惑。在这篇博客文章里,我已经试图描述一个用户例子,即当开发者需要在之后的代码中使用来自Promise对象的返回值的实例。 

 

英文原文链接:https://dev.to/ramonak/javascript-how-to-access-the-return-value-of-a-promise-object-1bck

 

更多中文参考资料

[1] JavaScript Promise - Javascript教程. https://www.runoob.com/js/js-promise.html

[2] JavaScript Promise 对象 – 编程技术. https://www.runoob.com/w3cnote/javascript-promise-object.html

[3] 7.6 Promise – 7. 浏览器 – JAVASCRIPT教程- 廖雪峰的官方网站. https://liaoxuefeng.com/books/javascript/browser/promise/index.html

 

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

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

相关文章

【CodeForces训练记录】Codeforces Round 1008 (Div. 2)

训练情况赛后反思 被A题吓了一跳,发现是结论题,C题构造思维定式了,以为一定要凑 \(a_1\),实则可以再找一个超过 \(b_i\) 值域的数 A题 平均数可以倒过来求数列和,所以这题只需要判断数列的和除以 n 是否等于 m 即可点击查看代码 #include <bits/stdc++.h> // #defin…

dotnet Cli sdk 什么是 Terminal Logger 以及如何禁用此功能

在 dotnet 9 的 SDK 版本里面,将 Terminal Logger 功能设置为默认。这是一个令我烦恼的功能。我将在这篇博客里面和大家介绍这是一个什么功能,以及如何将此功能禁用在 dotnet 9 默认开启的 Terminal Logger 功能,是在 dotnet 8 作为实验性引入的功能。核心原因是因为有开发者…

读DAMA数据管理知识体系指南16数据存储和操作活动

读DAMA数据管理知识体系指南16数据存储和操作活动1. 活动 1.1. 数据存储和操作包括数据库技术支持和数据库操作支持两个主要活动 1.2. 数据库技术支持侧重选择和维护用于存储和管理数据的软件 1.3. 数据库操作支持侧重软件所管理的数据和进程 2. 管理数据库技术 2.1. 技术管理的…

退役划水十 贝肯茨威格

发暗网上没过审,管理员说要来鲨我,只能发博客园了贝肯是贝肯,茨威格是茨威格,但这里是划水,不是史论,更不是冻鳗理论。 很多人都认为茨威格在《断头王后:玛丽安托瓦内特传》中有一段很文艺,很精辟的评价:“她那时候还太年轻,不知道所有命运赠送的礼物,早已在暗中标好…

How to use Linux shell echo date to a log file All In One

How to use Linux shell echo date to a log file All In One 如何使用 Linux shell 将日期打印输出到日志文件How to use Linux shell echo date to a log file All In One如何使用 Linux shell 将日期打印输出到日志文件solutions # 命令 ✅ $ date >> /etc/rc.local.m…

树莓派3B安装wiringpi失败的解决办法

大家好,我是努力赚钱的小智! 问题描述: 1.安装wiringpi失败 2.输入gpio -v与gpio readall命令出现not found系统信息 树莓派系统是32位!解决办法 1.确认是否需要树莓派系统配置镜像源 2.确认是否已经安装git sudo apt-get install git若遇到上图的情况,请直接按下回车键! …

全链路测试中的影子体系

一、全链路测试的入门理解 1.1什么是全链路测试? 全链路测试是指对系统中所有组件和服务的完整流程进行测试,确保从用户请求到系统响应的每个环节都能正常工作。它覆盖了前端、后端、数据库、第三方服务等所有部分。通俗解释:想象你在网上购物,从搜索商品到下单、支付、收货…

Linux rc.local rc.d All In One

Linux rc.local & rc.d All In One Linux 系统开机/登录自启动配置文件 /etc/rc.local /etc/rc.dLinux rc.local & rc.d All In OneLinux 系统开机/登录自启动配置文件rc.localRaspberry Pi$ cat /etc/rc.localrc.dCentOS / Ubuntu$ ls -al /etc/rc.ddemos eric@rpi3b:…

基本进程调度算法

本文讨论了硬件和操作系统是如何支持进程调度的,并列举了一些进程调度算法。希望本文能帮助读者快速建立起对进程调度的认识。在下一篇文章中,我们将不使用这个假设,再给出一些调度策略。写在前面 在了解了进程的基本概念之后,我们开始学习进程调度算法。本文讨论了硬件和操…

FastAPI 自定义参数验证器完全指南:从基础到高级实战

title: FastAPI 自定义参数验证器完全指南:从基础到高级实战 date: 2025/3/11 updated: 2025/3/11 author: cmdragon excerpt: 本教程深入探讨 FastAPI 中自定义参数验证器的使用,特别是通过 Field 函数进行数据校验。从基础概念到高级用法,通过详细的代码示例、课后测验和…

B端、G端需求调研流程

与C端的流程不同,B端和G端之类的产品,在需求调研阶段就有较多差异。这篇文章,我们来看看作者分享的这些经验。需求调研流程主要包含“调研前准备”、“调研中过程”、“调研后输出”三块内容。调研前:准备 第一步:沟通项目情况 在产品正式需求调研前,相信已经有售前初步跟…

Hetao P1287 小核桃玩核桃棋 题解 [ 蓝 ] [ 观察 ] [ 二维 dp ] [ 容斥原理 ]

很厉害的观察性质,加上 dp 辅助计数的题。小核桃玩核桃棋:质量挺高的一道 dp,好像是搬的某场神秘 ICPC 的?观察 首先我们观察最优解有什么性质,显然这个问题就是要我们选择一些点覆盖所有的行与列。贪心地考虑,不难想出我们从 \((1,1)\) 开始按照对角线来放置,就一定能取…