承诺解决了

承诺解决了

在将Promise集成到工作流程时,并非所有函数都需要是Promise,关键在于保持Promise链的完整性。

谨记:勿断链

正如Fleetwood Mac所唱,“永远不要打破链条”。 在异步工作流程中,避免从外部访问异步操作的结果是至关重要的。无论是Promise、async/await还是事件监听器,都应始终保持在Promise链内。

函数会被添加到microtask队列中,确保在所有同步代码执行完毕后再执行。即使Promise本身是Promise.resolve()或Promise.all([])也是如此。

以下示例展示了错误的做法:

let data = 'one';// then()中的函数会被排队Promise.resolve().then(() => {  data += ' two';});// 这行代码在数据更新之前执行console.log(data); // 'one'

登录后复制

正确的做法是保持Promise链的完整性:

let data = 'one';Promise.resolve().then(() => {  data += ' two';}).then(() => {  console.log(data); // 'one two'});

登录后复制

事实上,将数据存储在Promise链之外通常是不必要的。更优雅的写法:

Promise.resolve('one')  .then(data => `${data} two`)  .then(console.log);

登录后复制

值直接在Promise链中传递和更新。 所有操作都在Promise链内完成,即使并非所有函数都是异步的。它们对Promise一无所知,但依然受益于Promise链提供的顺序保证。

Promise链的优势:

Promise链简化了异步操作的管理。无论函数是否返回Promise,只要在链内,执行顺序就得到保证。 我们只需要在链的起始处确保一个Promise即可,例如使用Promise.resolve()。

Promise.resolve()的包装作用:

Promise.resolve()可以巧妙地处理已存在的Promise。无论接收到的值是已解决的Promise、未决的Promise还是被拒绝的Promise,Promise.resolve()都会将其解包并传递其结果。

const resolvedPromise = new Promise((resolve) => resolve('yes'));const foreverPending = new Promise(() => {});const rejectedPromise = Promise.reject(new Error('no!'));Promise.resolve(resolvedPromise)  .then(console.log); // 'yes'Promise.resolve(foreverPending)  .then(() => console.log('resolved'))  .catch(() => console.log('rejected'));Promise.resolve(rejectedPromise)  .catch(console.error); // Error: no!

登录后复制

这种解包是严格相等的,确保得到的是原始Promise,而非副本。

对于多个Promise的情况,Promise.all()可以同时处理Promise和值。

Promise.all([10, Promise.resolve(4)])  .then(console.log); // [10, 4]

登录后复制

Promise.resolve()的力量:

Promise.resolve()确保了Promise链的起始,并解包已存在的Promise。 这使得我们能够专注于操作的顺序,而无需关心每个函数是否返回Promise。

以下示例展示了如何使用Promise.resolve()来处理异步操作,即使其中一些函数不是异步的:

const getUserData = () => ({ username: 'mySuperUniqueName', password: '123456' });const getWeakPasswords = () => ['password', '123456'];const isUserPasswordWeak = ([user, weakPasswords]) => weakPasswords.includes(user.password);const reportPasswordStrength = (isWeak) => console.log(isWeak ? 'You should change your password.' : 'This seems fine for now.');Promise.all([getUserData(), getWeakPasswords()])  .then(isUserPasswordWeak)  .then(reportPasswordStrength); // 'You should change your password.'

登录后复制

即使getUserData和getWeakPasswords函数不是异步的,使用Promise.all和Promise.resolve依然可以保证操作的顺序和可读性。 将这些函数改为异步操作也不会影响其余代码。

总结:

将Promise视为程序控制流的管理工具,而非仅仅用于处理异步请求。 将操作分解成独立的函数,构建程序流,然后根据需要逐步将其转换为异步版本。 这有助于提高代码的可读性和可维护性。

以上就是承诺解决了的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2640475.html

(0)
上一篇 2025年3月7日 06:18:42
下一篇 2025年2月23日 13:29:10

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 双向将信号输入对象值绑定为[(ngmodel)]

    最近,我遇到了这一挑战…重构形式成分的角度信号。 旧形式组件的工作原理: > 表单数据来自反应性状态服务>表单数据是对象>在将其传递给form component>之前,将其形式数据克隆到克隆之前表单组件…

    2025年3月7日
    200
  • 在您的网站上创建分步指南

    网站分步向导最佳实践及库推荐 概述 交互式分步向导是引导用户、讲解复杂功能、提升网站用户体验的有效工具。本文将介绍几个优秀的JavaScript库,帮助您轻松创建分步向导。 为何使用分步向导? 分步向导优势显著: 改进用户上手体验: 帮助用…

    2025年3月7日
    200
  • 具有观察型的国家管理

    将列表渲染到DOM并管理其状态与管理简单变量的状态大相径庭。 一些库使用特殊的标识符,称为“键”,来启用其增量渲染引擎,从而确定发生了哪些更改以及需要移动哪些内容:“`javascript{friends.map(friend …

    2025年3月7日
    200
  • 用尾风CSS构建可扩展和可重复使用的反应组件

    在现代Web开发中,构建可扩展、可复用的组件对于保持代码库的整洁和高效至关重要。React基于组件的架构非常适合此目的。结合Tailwind CSS(一个实用优先的CSS框架),您可以创建高度可定制且易于维护的UI组件。本文将探讨如何使用T…

    2025年3月7日
    200
  • 模块串件的工作方式

    模块打包器是什么? 模块打包器是一种工具,它将多个文件(模块)打包成一个或几个可在浏览器中高效加载的文件,从而优化代码结构和性能。 模块打包器的运作流程: 模块打包器的工作步骤如下: 入口点查找: 从应用程序的入口点(通常是 index.j…

    2025年3月7日
    200
  • 了解大o符号

    掌握大O符号,先要理解算法的概念。在计算机科学中,大O符号用于分析算法的时间和空间复杂度随输入规模增长的情况。 通过大O符号,我们可以比较不同算法的效率,选择最优解,确保算法在输入规模增大时仍能保持良好的性能。大O符号关注算法的可扩展性,让…

    2025年3月7日
    200
  • 马里兰州的案例搜索

    马里兰州的案例搜索是在线工具。它可以访问马里兰州的许多法院记录。从州法院找到并获取公共案件信息很容易。您可以获取刑事,民事,家庭法,交通和遗嘱认证案件细节。 因此,创建了该系统是为了使事情变得透明,并简化了这些法律文件。无论您是普通公民,法…

    编程技术 2025年3月7日
    200
  • 从HTML创建PDF

    从html创建pdf:一种无需php库的简易方法 许多开发者使用PHP库(如tcpdf)从HTML生成PDF,但这些库代码复杂,修改困难且效率低下。本文介绍一种更简洁的方法,利用JavaScript库jspdf和jspdf-autotabl…

    2025年3月7日
    200
  • 顶级React JS访谈问题

    精通React框架的关键概念和原则对每位React开发者至关重要。本文总结了十个核心问题,涵盖了React开发的各个方面,无论您是准备面试还是提升技能,都将受益匪浅。建议您在查看答案前尝试独立作答,这将帮助您更好地评估自身掌握程度并发现需要…

    2025年3月7日
    200
  • 在实践中反应:用钩子改善形式

    使用表格 一个常见的情况是处理表格的逻辑,可以为自定义钩提取 // form.tsximport { formeventhandler, usestate } from “react”;function forms() { const [t…

    编程技术 2025年3月7日
    200

发表回复

登录后才能评论