”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 关于 Javascript Promise 的有趣事实

关于 Javascript Promise 的有趣事实

发布于2024-11-09
浏览:854

fun facts about Javascript Promises

Promise 始终是异步的

Promise 的回调总是在同步代码之后执行


const promise = Promise.resolve(); 
promise.then(() => console.log('async')); 
console.log('sync');

//sync
//async



连锁承诺返回新承诺

Promise 每次调用时都会返回一个新的 Promise


const p = Promise.resolve(); 
const chain = p.then(() => {}); 
console.log(p === chain); //false



就这样永远()

Promise 支持无限链接


Promise.resolve(1) 
    .then(value => value   1) 
    .then(value => value   1) 
    .then(value => console.log(value)); // 3



您可以将回调转换为承诺

您可以包装使用回调的旧代码,以与现代 async/await 一起使用


function asyncOperation(callback) { 
    setTimeout(() => callback(null, 'Im a callback'), 1000); 
} 

const promisified = () => new Promise((resolve, reject) => { 
    asyncOperation((err, result) => { 
        if (err) reject(err); 
        else resolve(result); 
    }); 
});

promisified().then(result => console.log(result)); // "Im a callback"



Promise.resolve() 并不总是创建新的 Promise

如果您传递非 Promise 值,Promise.resolve() 会将其包装到已解决的 Promise 中。但如果你传递一个承诺,它只会返回相同的承诺


const p1 = Promise.resolve('Hello'); 
const p2 = Promise.resolve(p1); 
console.log(p1 === p2); // true



您可以处理链中任何位置的错误


Promise.reject('Error!')
  .then(() => console.log('This will not run'))
  .then(() => console.log('This will also not run'))
  .catch(err => console.log('Caught:', err))
  .then(() => console.log('This will run'));



finally() 不传递值

finally() 方法不接收或修改解析值。它用于清理资源并运行,无论 Promise 解决还是拒绝。


Promise.resolve('resolved')
  .then(value => console.log(value))
  .finally(() => console.log('Cleanup'))

//resolved
//cleanup



承诺一旦确定就不可更改

一旦 Promise 被解决(解决或拒绝),它的状态就是不可变的。此后无法更改,即使您再次尝试解决/拒绝它。


const p = new Promise((resolve, reject) => {
  resolve('First');
  resolve('Second');
});
p.then(value => console.log(value));  //"First" (only the first value is used)



您可以链接 catch() 来处理特定错误


Promise.reject('type C error')
  .catch(err => {
    if (err === 'type A error') console.log('handle type A');
    throw err;
  })
  .catch(err => {
    if (err === 'type B error') console.log('handle type B');
    throw err;
  })
  .catch(err => {
    if (err === 'type C error') console.log('handle type C');
    throw err;
  })



您可以将await 与非promise 值一起使用


async function demo() {
  const result = await 42; //not a promise
  console.log(result);      
}
demo(); //42


就是这样!感谢您阅读本文。下次再见!

版本声明 本文转载于:https://dev.to/theteabagcoder/10-fun-facts-about-javascript-promises-3jle?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 如何高效地在嵌套的 JavaScript 对象中查找特定对象?
    如何高效地在嵌套的 JavaScript 对象中查找特定对象?
    迭代嵌套的 JavaScript 对象迭代嵌套的 JavaScript 对象可能具有挑战性,特别是当您需要基于属性检索特定对象时价值。让我们考虑以下示例:var cars = { label: 'Autos', subs: [ { label: 'SUVs', ...
    编程 发布于2024-11-09
  • 最简单的状态教程
    最简单的状态教程
    Zustand 是一个小型、快速且可扩展的 React 状态管理库,可作为 Redux 等更复杂解决方案的替代方案。 Zustand 获得如此大关注的主要原因是与 Redux 相比,它的体积小且语法简单。 了解 Zustand 设置 首先,如果您还没有安装 Zustand 和 Typ...
    编程 发布于2024-11-09
  • 如何修复 macOS 上 Django 中的“配置不正确:加载 MySQLdb 模块时出错”?
    如何修复 macOS 上 Django 中的“配置不正确:加载 MySQLdb 模块时出错”?
    MySQL配置不正确:相对路径的问题在Django中运行python manage.py runserver时,可能会遇到以下错误:ImproperlyConfigured: Error loading MySQLdb module: dlopen(/Library/Python/2.7/site-...
    编程 发布于2024-11-09
  • MongoDB 服务器:概述
    MongoDB 服务器:概述
    MongoDB 是一种流行的 NoSQL 数据库,提供高性能、可扩展且灵活的数据存储解决方案。与使用表和行的传统关系数据库不同,MongoDB 使用灵活的、类似 JSON 的结构(称为 BSON(二进制 JSON))将数据存储在文档中。这使得 MongoDB 能够轻松处理复杂的数据类型和层次关系。...
    编程 发布于2024-11-09
  • 如何在 MySQL DELETE 语句中使用 LIMIT 删除一定范围的行?
    如何在 MySQL DELETE 语句中使用 LIMIT 删除一定范围的行?
    更正带有 LIMIT 的 MySQL DELETE 语句的语法尝试使用带有 LIMIT 的 DELETE 语句从 MySQL 表中删除一系列行时LIMIT 子句,如果语法不正确,您可能会遇到错误。此错误通常表明用于指定限制的语法存在问题。所提供的查询中的问题是您无法在 DELETE 语句的 LIMI...
    编程 发布于2024-11-09
  • 如何使用 os.walk() 在 Python 中创建带有深度指示器的结构化目录列表?
    如何使用 os.walk() 在 Python 中创建带有深度指示器的结构化目录列表?
    在 Python 中使用 os.walk() 递归地导航目录为了创建更结构化的目录列表,开发人员尝试修改他们的代码将目录显示为大写标题,并用虚线指示深度和目录下的文件。然而,他们最初的方法产生了不完整的结果。为了解决这个挑战,我们可以利用 Python 的 os.sep 属性来正确描述路径组件。这是...
    编程 发布于2024-11-09
  • Java 中的设计模式及其示例
    Java 中的设计模式及其示例
    Java 中的设计模式是什么? 设计模式是软件设计中常见问题的可重用解决方案。它们代表了可应用于软件开发中各种情况的最佳实践,特别是像 Java 这样的面向对象编程。 设计模式的类型 创建模式: 处理对象创建机制。 结构模式: 关注类和对象的组成方式。 行为模...
    编程 发布于2024-11-09
  • NestJS 与 Encore.ts:为您的 TypeScript 微服务选择正确的框架
    NestJS 与 Encore.ts:为您的 TypeScript 微服务选择正确的框架
    Introduction When web applications grow larger, so does the complexity in developing and maintaining the system. A common way to solve this i...
    编程 发布于2024-11-09
  • 如何在 Python 中重置生成器对象?
    如何在 Python 中重置生成器对象?
    在 Python 中重置生成器对象:探索替代方案生成器提供了一种迭代值序列的有效方法,而无需在记忆。然而,一旦生成器产生了所有值,它就会耗尽并且不能直接重用。这就提出了如何在 Python 中重置生成器对象的问题。不幸的是,生成器没有内置的重置方法。要重用生成器,您有多种选择:再次运行生成器函数: ...
    编程 发布于2024-11-09
  • 如何高效地检索MySQL中最后插入的行?
    如何高效地检索MySQL中最后插入的行?
    检索 MySQL 中最后插入的行:高效方法高效检索 MySQL 中最后插入的行是数据库编程中的常见任务。以下是实现此目的的两种有效方法:1。时间戳列:理想的解决方案是创建一个 TIMESTAMP 列,在行插入时自动捕获当前时间戳。这提供了一种可靠且准确的方法来确定最近的记录。2。 ORDER BY ...
    编程 发布于2024-11-09
  • 如何最小化 Go 中禁用跟踪日志记录语句的成本?
    如何最小化 Go 中禁用跟踪日志记录语句的成本?
    Go 中禁用语句的低成本跟踪日志记录在 Go 中,跟踪日志记录提出了一个独特的挑战:最大限度地减少关键路径中禁用日志语句的成本。与 C/C 不同,Go 没有预处理器宏,因此有必要探索替代解决方案。一种方法涉及使用 fmt.Stringer 和 fmt.GoStringer 接口。通过延迟格式化直到日...
    编程 发布于2024-11-09
  • 如何在 JavaScript 中将多个数组合并为一个?
    如何在 JavaScript 中将多个数组合并为一个?
    将数组项连接成单个数组在 JavaScript 中,将多个数组的元素组合成一个新数组可能是一种常见的需求。实现此目的的一种方法是使用循环迭代每个源数组并将项目推入目标数组。然而,这种方法可能乏味且效率低下。利用“concat”函数幸运的是,JavaScript 提供了一个更简单、更优雅的解决方案:“...
    编程 发布于2024-11-09
  • 掌握 JavaScript 中的循环:综合指南
    掌握 JavaScript 中的循环:综合指南
    循环是编程的基础:使我们能够用最少的代码执行重复性任务。无论您是刚刚入门的初学者,还是希望精炼知识的经验丰富的开发人员,理解循环都将大大增强您编写高效、干净且有趣的代码的能力。 在本指南中,我们将深入探讨不同类型的循环、它们在流行编程语言中的语法,以及有关何时以及如何有效使用它们的一些提示。 什么是...
    编程 发布于2024-11-09
  • 如何在不使用外部程序的情况下在 PHP 中确定超过 2GB 文件的文件大小?
    如何在不使用外部程序的情况下在 PHP 中确定超过 2GB 文件的文件大小?
    在 PHP 中无需外部程序即可确定 2GB 文件的大小PHP 在处理超过 2GB 的文件大小方面的限制可能会令人沮丧。然而,有一些方法可以克服这个问题,而无需求助于外部程序。一种方法是通过“大文件工具”,这是一个开源项目,可以在 PHP 中操作超过 2GB 的文件,即使在 32 位系统上也是如此。 ...
    编程 发布于2024-11-09
  • 在 macOS 上的 Python 中使用 MySQLdb 时如何修复“未加载库:libmysqlclient.16.dylib”错误?
    在 macOS 上的 Python 中使用 MySQLdb 时如何修复“未加载库:libmysqlclient.16.dylib”错误?
    Python:MySQLdb 和“未加载库:libmysqlclient.16.dylib”设置尝试中为了在 macOS X 10.6 上建立 Python/Django 的开发环境,从提供的 DMG 安装了 MySQL,并使用 pip 安装了 MySQL-python。Issue尝试导入 MySQ...
    编程 发布于2024-11-09

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3