构造函数函数返回承诺是不是很糟糕?

在前端开发中,我们经常会遇到需要进行异步操作的情况。JavaScript 中提供了 Promise 来处理异步操作,而 Promise 可以通过构造函数来创建。

然而,使用构造函数返回 Promise 并不是一个好的实践。在本文中,我们将探讨这种做法的问题,并给出更好的替代方案。

什么是构造函数返回 Promise?

在 JavaScript 中,Promise 是一个能够管理异步操作状态的对象。通过 Promise,我们可以优雅地处理异步操作,并对其进行流程控制和错误处理等操作。

通常,我们使用 Promise.resolve 或 Promise.reject 构造 Promise 如下所示:

----- --------------- - ------------------------

----- --------------- - ------------------ ---------------

但是,我们也可以使用 Promise 的构造函数来创建 Promise。具体实现如下:

----- ------------------ - --- ----------------- ------- -- -
  -- ------
  -- ------- --------------
  -- ------- -------------
---

在构造函数中,我们传入一个函数作为参数,这个函数接受两个参数:resolve 和 reject。当异步操作执行完成后,我们要么调用 resolve 方法并传入异步操作的结果,表示异步操作成功;要么调用 reject 方法并传入错误信息,表示异步操作失败。

构造函数返回 Promise 的问题

在实际的开发中,我们可以使用构造函数返回 Promise,但这种做法存在一些问题:

1. 可能会误解异步操作的执行

在 JavaScript 中,Promise 会将异步操作加入事件循环队列中,并在下一个周期执行。如果我们使用构造函数返回 Promise,可能会误解异步操作是否已经执行完成。

例如,在下面的代码中,我们使用构造函数返回 Promise 来模拟异步操作:

-------- ------------- -
  ------ --- ----------------- ------- -- -
    ------------- -- -
      ---------------------
    -- ------
  ---
-

----- ------ - --------------
-------------------- -- -- ------- - --------- -

由于 Promise 是异步操作,因此上面的代码将输出 Promise { }。这看起来好像 doSomething 函数还没有执行完成,实际上它只是加入了事件循环队列中等待执行。因此,如果我们想要获得异步操作的结果,就需要使用 then 或 await 方法。

2. 可能会引起性能问题

使用构造函数返回 Promise 还可能会导致性能问题。每次创建 Promise 都会分配内存,并且会执行其他一些初始化工作。如果我们使用构造函数返回 Promise 创建了大量 Promise,就可能会引起性能问题。

例如,在下面的代码中,我们创建了 1000 个 Promise:

--- ---- - - -- - - ----- ---- -
  ----- ------- - --- ----------------- ------- -- -
    -----------
  ---
-

上面的代码将创建 1000 个 Promise,并且会分配大量内存。这可能会导致浏览器变慢,并导致页面卡顿。

更好的替代方案

为了避免使用构造函数返回 Promise 带来的问题,我们可以使用更好的替代方案。具体而言,我们可以使用 Promise.resolve 或 Promise.reject 来构造 Promise。

例如,在下面的代码中,我们使用 Promise.resolve 来创建一个成功的 Promise:

-------- ------------- -
  ------ -----------------------------
-

----- ------ - --------------
-------------------- -- -- ------- - ----------- -

由于 Promise.resolve 是同步执行的,因此上面的代码将输出 Promise { 'something' }。这样我们就可以直接访问异步操作的结果,而无需使用 then 或 await 方法。

如果我们需要处理

来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/10687


猜你喜欢

  • 如何获取JavaScript对象的属性子集

    在前端开发中,获取JavaScript对象的属性子集是一项常见的操作。本文将介绍几种方法来实现这个目标,并提供具体的示例代码。 方法一:使用解构赋值 解构赋值是ES6中的一项新功能,它允许我们从一个对...

    7 年前
  • 在JavaScript中的圆括号之间获取字符串的正则表达式

    正则表达式是一种强大而灵活的工具,用于在文本中匹配模式。在JavaScript中,可以使用正则表达式来解析和提取文本中的信息。其中一个常见的需求是从一个字符串中提取圆括号之间的内容。

    7 年前
  • 前端小技巧:两数相加

    在前端开发中,我们经常需要进行数字计算。在本文中,我们将学习如何使用 JavaScript 将两个数字相加,并展示一些实用的示例代码。 语法 JavaScript 提供了一个简单的加法运算符 +,可以...

    7 年前
  • 在现代浏览器中,JSON劫持仍然是一个问题吗?

    JSON劫持(JSON Hijacking)是一种安全漏洞,它利用了浏览器的跨域限制和某些网站错误地使用JSON作为数据交换格式的行为。攻击者可以通过注入恶意JavaScript代码来获取数据,可能包...

    7 年前
  • 什么是“倍以上内容在谷歌PageSpeed”?

    简介 "倍以上内容在谷歌PageSpeed"(LCP)指的是页面加载过程中最长的渲染时间,也就是页面上最重要的元素需要多久才能完全显示给用户。Google认为如果LCP超过2.5秒,那么这个页面的性能...

    7 年前
  • src 和 dist 文件夹的作用是什么?

    当我们开始一个前端项目时,通常会看到两个文件夹:src 和 dist。这两个文件夹在前端开发中有着非常重要的作用。本文将详细阐述它们的意义和如何使用。 src 文件夹 src 是源代码文件夹,包含了我...

    7 年前
  • 禁用移动浏览器上的悬停效果

    在移动端设备上,悬停效果(hover)是一个常见的交互特性。当用户在屏幕上将鼠标指针悬停在某个元素上时,该元素通常会显示出一些反馈或者效果,比如改变背景颜色、放大缩小等等。

    7 年前
  • 如何使用jQuery更改CSS?

    在前端开发中,经常需要动态地更改元素的样式。而jQuery是一种流行的JavaScript库,可以简化许多DOM操作,包括更改元素的CSS样式。 1. 选择器 在jQuery中,与CSS语法相同的选择...

    7 年前
  • 使用 JavaScript 替换多个字符串

    在 Web 开发中,我们常常需要对字符串进行操作。其中一项常见的操作是替换文本中的某些字符串。如果只需替换一个固定的字符串,这个任务十分简单。但如果需要同时替换多个不同的字符串,该怎么办呢?本文将介绍...

    7 年前
  • 在JavaScript中使用null或未定义的时间是什么时候?[重复]

    很抱歉,您的问题是一个重复的问题。以下是我为另一个用户提供的类似答案: 在JavaScript中,null和undefined是常用的两种表示“无值”的方式。然而,在使用它们表示时间时,需要注意一些细...

    7 年前
  • 如何从节点中的字符串创建流?Js?

    在前端开发中,有时需要将字符串转换为可读流(Readable Stream),以便对其进行分析、处理或传输。本文将介绍如何使用Node.js中的stream模块,从节点中的字符串创建流。

    7 年前
  • Chrome开发工具-修改JavaScript和重载

    简介 Chrome 开发工具是一个由 Google 公司开发的浏览器内置调试工具,它可以帮助开发者在开发过程中进行调试、分析和优化,包括修改网页的样式、网络请求、JavaScript 代码等。

    7 年前
  • 为什么(0);“A:”和“0”=“真”的行为不同吗?“A:B);[重复]

    在 JavaScript 中,我们经常会遇到一些看起来很奇怪的语法和行为。其中一个是 (0) 和 "" == false 等表达式返回 true,而 ("A" == true) 和 ("0" == f...

    7 年前
  • 什么是“变”的意思是在CoffeeScript的教程吗?

    在CoffeeScript中,“变”(Variables)是一个非常重要的概念。与JavaScript相似,CoffeeScript使用变量来存储数据并在程序中进行引用。

    7 年前
  • 如何使用jQuery获得< > > >值?

    在前端开发中,经常需要获取 HTML 元素的值来进行一些操作。而 jQuery 是一个流行的 JavaScript 库,可以简化 DOM 操作,使得获取元素的值变得更加方便。

    7 年前
  • JavaScript:扩展和原型是用来做什么的?

    JavaScript 是一种面向对象的编程语言,其基础理论是通过对象来组织代码,对象可以继承属性和方法。在 JavaScript 中,扩展和原型是两个重要的概念,它们可以帮助我们更好地理解对象之间的关...

    7 年前
  • 序列化含循环对象的对象在前端开发中的价值

    在前端开发中,序列化(Serialization)是非常常见的操作。序列化对象的目的是将其转换为字符串,以便于在网络上传输或者存储到本地浏览器缓存中。然而,当序列化的对象包含循环引用时,就需要使用特殊...

    7 年前
  • 我如何使用 Node.js 的一个 C++ 库?

    Node.js 是一种非常流行的 JavaScript 运行时环境,它可以让开发人员使用 JavaScript 语言来构建服务器端应用程序。然而,有些情况下,仅使用 JavaScript 无法实现某些...

    7 年前
  • 删除查询字符串URL

    在前端开发中,我们经常需要处理 URL。其中一个常见的需求是删除查询字符串(query string)。本文将介绍如何使用 JavaScript 和正则表达式来实现这个功能。

    7 年前
  • 如何在HTML表格上执行实时搜索和筛选

    引言 在前端开发中,我们经常会使用表格来展示大量的数据。当数据变得越来越多时,用户可能需要进行搜索和筛选操作来更好地浏览数据。本文将介绍如何使用JavaScript和jQuery在HTML表格上执行实...

    7 年前

相关推荐

    暂无文章