您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > javascript

JavaScript 和 Typescript 中的 Promise

时间:2023-01-09 13:57:20  来源:今日头条  作者:启辰8

厌倦了理清 JAVAScript 或 TypeScript 项目中的异步代码?

您是否希望有一种方法可以使您的异步进程像运转良好的机器一样运行? 如果是这种情况,我们为您提供了一个解决方案:promises - 任何出色的异步配方中的关键成分。 它们让您以更有序和更易于理解的方式管理异步操作,让您专注于编码的更有趣的方面。 我们将在本文中带您游览狂野而美丽的promises世界。

 什么是promise?

什么是承诺?

JavaScript 中,promise 是一种以更有条理、更易于理解和更简洁的方式处理异步操作的方法。 它们使您能够构建以可预测的顺序方式运行的代码,即使操作本身是并行发生的。

Promise 是通过将函数作为参数传递给 Promise 构造函数来创建的。 这个函数被称为执行函数,它负责执行异步操作。 执行函数有两个参数:resolve 和 reject。 这些功能用于履行(解决)或拒绝承诺。

以下面的例子为例,其中一个承诺是用一个等待 3 秒的执行函数创建的,然后用“Hey!My name is Bruno.”的值解析promise:

const myPromise = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve("Hey!My name is Bruno.");
  }, 3000);
});

在创建承诺后,您可以使用 then() 方法来告诉它在解决或拒绝时做什么。 作为参数,它需要两个函数:一个用于 resolve 分支,一个用于 refuse 分支。

考虑以下场景,其中 resolve 分支打印消息“Hey!My name is Bruno.”,而 reject 分支在另一方面记录一条错误消息:

myPromise.then(
  (message) => {
    console.log(`The promise has been resolved: ${message}`)
  },
  (error) => {
    console.log(`The promise has been rejected: ${error}`)
  }
);

⛓ 链接promises

链接promise允许您创建一系列异步操作,这些操作按顺序/一个接一个地执行。

myPromise
  .then((message) => {
    console.log(message); // Hey!My name is Bruno.
    return message + " I am a software developer."
  })
  .then((message) => {
    console.log(message); // Hey!My name is Bruno. I am a software developer.
  })

上面的prmise是链接的,第一个 then() 记录消息的第一个版本,而第二个 then() 记录与 return 语句中的字符串连接的消息。

现在让我们继续讨论 promise 的一些用例。

 你可以在哪里使用promise?

在不同的情况和场景中,可以使用 promises 来执行异步操作。

处理 HTTP 请求

可以以一种干净且易于理解的方式处理 HTTP 请求。 我们将使用 AxIOS 库来说明一个示例,它基本上与已经内置的 fetch() 执行相同的操作:

import axios from "axios";

const API_URL = "dummyapithatdoesnotexist.com/data";

axios.get(API_URL)
  .then((response) => response.json())
  .then((jsonData) => console.log(jsonData)) // data from the API
  .catch((error) => console.log(`There has been an error: ${error}`));

请注意 promise 末尾的“catch()”方法。“catch()”用于处理在尝试解析 promise 时发生的任何错误。 它非常有价值,也是异步操作的一个重要方面,因为它提供了为什么它们没有成功的上下文(例如,当没有互联网连接或服务器关闭时)。

当然还有其他场景可以使用 promises,但这个场景很好地说明了一个广为人知的场景。

 JavaScript 和Typescript中的Promise

您现在可能会问自己:但是……JavaScript 和 Typescript 中的 promises 有什么区别?

好吧,当然,这是一个很好的问题,我们现在将讨论这个问题。

为了创建承诺,JavaScript 和 TypeScript 都使用 Promise 构造函数,并且两种语言都使用 then() 方法来指示在解决或拒绝承诺时应该发生什么。

JavaScript 承诺和 TypeScript 承诺之间的一个重要区别是,在 TypeScript 中,您使用更强大的类型检查,这有助于防止代码中的错误和错误。 这可以避免在一天结束前一直头痛的困扰(到底哪里错了?)。 更强的类型允许您声明 promise 将解析或拒绝的值类型,而 JavaScript 依赖于运行时类型检查。 这是在项目中使用 JavaScript 或 Typescript 时要牢记的一个重要方面。

Typescript 中类型化承诺的示例如下所示:

import axios from "axios";

const API_URL: string = "dummyapithatdoesnotexist.com/data";

const myPromise: Promise<string> = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve("Hey!My name is Bruno.");
  }, 3000);
});

在指定 then() 和 catch() 场景时,您还可以按以下方式键入它们:

import axios from "axios";

const API_URL: string = "dummyapithatdoesnotexist.com/data";

axios.get(API_URL)
  .then((response: Response) => response.json())
  .then((jsonData: any) => console.log(jsonData)) // data from the API
  .catch((error: any) => console.log(`There has been an error: ${error}`));

在 Typescript 中,您还可以使用 async 和 awAIt,前者允许您指示操作是异步的,后者会暂停函数的执行,直到 promise 得到解决。

import axios from 'axios';

const API_URL: string = 'dummyapithatdoesnotexist.com/data';

async function getData() {
  try {
    const response: AxiosResponse = await axios.get(API_URL);
    const jsonData: any = response.data;
    console.log(jsonData);
  } catch (error) {
    console.log(`There has been an error: ${error}`);
  }
}

getData(); // logs the data from the API

AxiosResponse 类型是从 axios 库中导入的,用于键入本示例中的响应变量。 要从 API 响应中获取 JSON 数据,请使用 response.data 属性。 jsonData 变量是 any 类型,表明它可以保存任何类型的值。 error 变量的类型也为 any,暗示它也可能是任何类型。

async 关键字将 getData() 函数标识为异步函数,而 await 关键字暂停函数的执行,直到承诺得到解决。 如果在请求期间发生错误,catch() 块会检测到错误并将其记录到控制台。

感谢您的阅读!

在了解了 JavaScript 和 Typescript 中所有这些 promises 的点点滴滴之后,您现在应该能够在代码中以非类型化或类型化的方式应用它们。 恭喜,希望对您有所帮助!



Tags:JavaScript   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
17 个你需要知道的 JavaScript 优化技巧
你可能一直在使用JavaScript搞开发,但很多时候你可能对它提供的最新功能并不感冒,尽管这些功能在无需编写额外代码的情况下就可以解决你的问题。作为前端开发人员,我们必须了解...【详细内容】
2024-04-03  Search: JavaScript  点击:(6)  评论:(0)  加入收藏
你不可不知的 15 个 JavaScript 小贴士
在掌握如何编写JavaScript代码之后,那么就进阶到实践&mdash;&mdash;如何真正地解决问题。我们需要更改JS代码使其更简单、更易于阅读,因为这样的程序更易于团队成员之间紧密协...【详细内容】
2024-03-21  Search: JavaScript  点击:(27)  评论:(0)  加入收藏
使用 JavaScript 清理我的 200GB iCloud,有了一个意外发现!
本文作者在综合成本因素之下,决定用 Java 脚本来清理一下自己的 iCloud,结果却有了一个意外发现,即在 iCloud 中上传同一个视频和删除此视频之后,iCloud 的空间并不一致,这到底是...【详细内容】
2024-01-11  Search: JavaScript  点击:(99)  评论:(0)  加入收藏
JavaScript 真的是在 10 天内完成的吗?
起初网景公司用了十天时间创建了一个 Java,后来它成为事实上的 Web 标准,并横扫各大编程语言榜单成为开发者最受欢迎的语言之一。近日,有开发者对 Java 的开发周期提出了质疑,以...【详细内容】
2024-01-03  Search: JavaScript  点击:(85)  评论:(0)  加入收藏
创建一个双模式跨运行时的 JavaScript 包,你学会了吗
本文将指导你发布双模式、跨运行时的 JavaScript 包。了解如何创建与 ESM 和 CommonJS 以及 Node.js、Deno 和浏览器等不同运行时兼容的库。随着 JavaScript 开发的不断发展...【详细内容】
2023-12-27  Search: JavaScript  点击:(159)  评论:(0)  加入收藏
五种在 JavaScript 中创建对象的方法
在 JavaScript 中,对象是多功能工具,可以通过多种方式创建,每种方式适合不同的场景。了解何时使用每种方法是编写高效且可维护的 JavaScript 代码的关键。让我们探讨在 JavaScr...【详细内容】
2023-11-23  Search: JavaScript  点击:(239)  评论:(0)  加入收藏
GitHub:程序员正积极使用 AI 编程、JavaScript 语言依然最流行
IT之家 11 月 20 日消息,GitHub 发布了 2023 年度 Octoverse 开源状态报告,其中主要强调了 AI 在开发过程中的作用,并围绕云和 Git 的开源活动展开。官方介绍称,今年的三大趋势...【详细内容】
2023-11-20  Search: JavaScript  点击:(171)  评论:(0)  加入收藏
通过示例解释所有 JavaScript 数组方法
作为一名程序员,我们的工作是写有效的代码,但是仅仅写有效的代码,这还不够。如果想成为优秀的程序员,我们还需要编写可维护和可扩展的代码。JavaScript为我们提供了很多可以用来...【详细内容】
2023-11-15  Search: JavaScript  点击:(264)  评论:(0)  加入收藏
JavaScript 地位不保!WasmGC 将成为下一个“网红”?
整理 | 太冷不穿格子衫 出品 | 51CTO技术栈(微信号:blog51cto)早在 2017 年,主流浏览器都已经支持 WebAssembly。随着 WebAssembly 的蓬勃发展,各种编程语言也在增加对它的支持。...【详细内容】
2023-11-13  Search: JavaScript  点击:(217)  评论:(0)  加入收藏
Jest:目前最广泛使用的前端 JavaScript 测试框架
Jest 是一个简单易用的 JavaScript 测试框架。最初由 Meta 公司团队维护。2022 年 5 月,Meta 公司正式将自己的开源项目Jest 移交给 OpenJS Foundation[1],这表示 Jest 由公司...【详细内容】
2023-11-08  Search: JavaScript  点击:(341)  评论:(0)  加入收藏
▌简易百科推荐
JavaScript的异步编程常见模式
在JavaScript中,异步编程是一种处理长时间运行操作(如网络请求或I/O操作)的常见方式。它允许程序在等待这些操作完成时继续执行其他任务,从而提高应用程序的响应性和性能。JavaS...【详细内容】
2024-04-12  靳国梁    Tags:JavaScript   点击:(2)  评论:(0)  加入收藏
17 个你需要知道的 JavaScript 优化技巧
你可能一直在使用JavaScript搞开发,但很多时候你可能对它提供的最新功能并不感冒,尽管这些功能在无需编写额外代码的情况下就可以解决你的问题。作为前端开发人员,我们必须了解...【详细内容】
2024-04-03  前端新世界  微信公众号  Tags:JavaScript   点击:(6)  评论:(0)  加入收藏
你不可不知的 15 个 JavaScript 小贴士
在掌握如何编写JavaScript代码之后,那么就进阶到实践&mdash;&mdash;如何真正地解决问题。我们需要更改JS代码使其更简单、更易于阅读,因为这样的程序更易于团队成员之间紧密协...【详细内容】
2024-03-21  前端新世界  微信公众号  Tags:JavaScript   点击:(27)  评论:(0)  加入收藏
又出新JS运行时了!JS运行时大盘点
Node.js是基于Google V8引擎的JavaScript运行时,以非阻塞I/O和事件驱动架构为特色,实现全栈开发。它跨平台且拥有丰富的生态系统,但也面临安全性、TypeScript支持和性能等挑战...【详细内容】
2024-03-21  前端充电宝  微信公众号  Tags:JS   点击:(26)  评论:(0)  加入收藏
构建一个通用灵活的JavaScript插件系统?看完你也会!
在软件开发中,插件系统为应用程序提供了巨大的灵活性和可扩展性。它们允许开发者在不修改核心代码的情况下扩展和定制应用程序的功能。本文将详细介绍如何构建一个灵活的Java...【详细内容】
2024-03-20  前端历险记  微信公众号  Tags:JavaScript   点击:(20)  评论:(0)  加入收藏
对JavaScript代码压缩有什么好处?
对JavaScript代码进行压缩主要带来以下好处: 减小文件大小:通过移除代码中的空白符、换行符、注释,以及缩短变量名等方式,可以显著减小JavaScript文件的大小。这有助于减少网页...【详细内容】
2024-03-13  WangLiwen    Tags:JavaScript   点击:(2)  评论:(0)  加入收藏
跨端轻量JavaScript引擎的实现与探索
一、JavaScript 1.JavaScript语言JavaScript是ECMAScript的实现,由ECMA 39(欧洲计算机制造商协会39号技术委员会)负责制定ECMAScript标准。ECMAScript发展史: 2.JavaScript...【详细内容】
2024-03-12  京东云开发者    Tags:JavaScript   点击:(2)  评论:(0)  加入收藏
面向AI工程的五大JavaScript工具
令许多人惊讶的是,一向在Web开发领域中大放异彩的JavaScript在开发使用大语言模型(LLM)的应用程序方面同样大有价值。我们在本文中将介绍面向AI工程的五大工具,并为希望将LLM...【详细内容】
2024-02-06    51CTO  Tags:JavaScript   点击:(53)  评论:(0)  加入收藏
JS小知识,使用这6个小技巧,避免过多的使用 if 语句
最近在重构我的代码时,我注意到早期的代码使用了太多的 if 语句,达到了我以前从未见过的程度。这就是为什么我认为分享这些可以帮助我们避免使用过多 if 语句的简单技巧很重要...【详细内容】
2024-01-30  前端达人  今日头条  Tags:JS   点击:(58)  评论:(0)  加入收藏
18个JavaScript技巧:编写简洁高效的代码
本文翻译自 18 JavaScript Tips : You Should Know for Clean and Efficient Code,作者:Shefali, 略有删改。在这篇文章中,我将分享18个JavaScript技巧,以及一些你应该知道的示例...【详细内容】
2024-01-30  南城大前端  微信公众号  Tags:JavaScript   点击:(71)  评论:(0)  加入收藏
站内最新
站内热门
站内头条