Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
JavaScript:恪守我们的承诺_创想鸟

JavaScript:恪守我们的承诺

javascript:恪守我们的承诺

JavaScript 通过其流行度和最近的改进,日益成为 Web 程序员最好的朋友。和所有最好的朋友一样,JavaScript 信守承诺。

这听起来可能有点奇怪,但这是事实。当前大多数浏览器都支持所谓的 Promise 对象。 Promise 很像一个函数,它代表您希望在未来某个时刻执行的一段代码或一项任务。

这是承诺的样子。

var myPromise = new Promise(function (resolve, reject) {    // Task to carry out goes here.});

您可以在这里看到,当我们创建一个 Promise 时,我们给它一个参数,这是一个包含我们希望在将来某个时刻执行的代码的函数。您可能还注意到函数中传递给 Promise 的两个参数: resolvereject。这些也是函数,是我们告诉 Promise 是否完成了承诺的方式。这是您使用它们的方式:

立即学习“Java免费学习笔记(深入)”;

var myPromise = new Promise(function (resolve, reject) {    if (true) {        resolve('Hello Tuts+ fans!');    } else {        reject('Aww, didn't work.');    }});

这个承诺显然总是会得到解决,因为 if 语句将始终为真。这只是出于学习目的 – 我们稍后会做一些更实际的事情 – 但想象一下用一段您不能 100% 确定是否有效的代码片段替换 true

现在我们已经创建了一个 Promise,我们该如何使用它呢?好吧,我们需要告诉它 resolvereject 函数是什么。我们通过使用 Promise 的 then 方法来做到这一点。

myPromise.then(function (result) {    // Resolve callback.    console.log(result); }, function (result) {    // Reject callback.    console.error(result);});

因为我们的 if 语句总是通过其 true 检查,所以上面的代码将始终记录“Hello Tuts+球迷!”到控制台。它也会立即执行。这是因为 Promise 构造函数内的代码是同步的,这意味着它不会等待任何操作的执行。它拥有继续进行所需的所有信息,并会尽快进行。

然而,Promise 真正发挥作用的地方是异步任务,即您不知道 Promise 何时具体实现的任务。异步任务的一个现实示例是通过 AJAX 获取资源,例如 JSON 文件。我们不知道服务器需要多长时间才能响应,甚至可能会失败。让我们在 Promise 代码中添加一些 AJAX。

var myPromise = new Promise(function (resolve, reject) {    // Standard AJAX request setup and load.    var request = new XMLHttpRequest();        // Request a user's comment from our fake blog.    request.open('GET', 'http://jsonplaceholder.typicode.com/posts/1');    // Set function to call when resource is loaded.    request.onload = function () {        if (request.status === 200) {            resolve(request.response);        } else {            reject('Page loaded, but status not OK.');        }    };    // Set function to call when loading fails.    request.onerror = function () {        reject('Aww, didn't work at all.');    }    request.send();});

这里的代码只是用于执行 AJAX 请求的标准 JavaScript。我们请求一个资源,在本例中是指定 URL 处的 JSON 文件,并等待它响应。我们永远不会知道确切的时间。我们显然不想停止执行脚本来等待它,那么我们该怎么办呢?

幸运的是,我们已将此代码放入 Promise 中。把它放在这里,我们基本上是在说,“嘿,一段代码,我现在得走了,但我稍后会给你打电话,告诉你何时执行。保证你会这么做并告诉我你什么时候完成?”代码会说:“是的,当然。我保证。”

上面代码中需要注意的重要一点是 resolvereject 函数的调用。请记住,这些是我们告诉我们的承诺我们的代码是否成功执行的方式。否则,我们永远不会知道。

使用基本示例中的相同代码,我们可以看到 Promise 中的 AJAX 请求现在将如何工作。

拍我AI 拍我AI

AI视频生成平台PixVerse的国内版本

拍我AI 190 查看详情 拍我AI

// Tell our promise to execute its code// and tell us when it's done.myPromise.then(function (result) {    // Prints received JSON to the console.    console.log(result);}, function (result) {    // Prints "Aww didn't work" or    // "Page loaded, but status not OK."    console.error(result); });

我知道我们可以信任你,myPromise

链接承诺

现在,您可能会认为 Promise 只是具有更好语法的奇特回调函数。这在某种程度上是正确的,但为了继续我们的 AJAX 示例,假设您需要再发出一些请求,每个请求都基于上一个请求的结果。或者如果您需要先处理 JSON 怎么办?

使用回调执行此操作将导致函数的大量嵌套,每个函数都变得越来越难以跟踪。幸运的是,在 Promise 的世界中,我们可以像这样将这些函数链接在一起。下面是一个示例,一旦我们收到用户在我们的假博客上发表的评论的 JSON,我们就需要确保它全部是小写,然后再对其进行其他操作。

myPromise    .then(function (result) {        // Once we receive JSON,        // turn it into a JSON object and return.        return JSON.parse(result);    })    .then(function (parsedJSON) {        // Once json has been parsed,        // get the email address and make it lowercase.        return parsedJSON.email.toLowerCase();    })    .then(function (emailAddress) {        // Once text has been made lowercase,        // print it to the console.        console.log(emailAddress);    }, function (err) {        // Something in the above chain went wrong?        // Print reject output.        console.error(err);    });

您可以在此处看到,虽然我们的初始调用是异步的,但也可以链接同步调用。 resolve 函数中的代码在 then 每个返回时都会被调用。您还会注意到,这里只为整个链指定了一个误差函数。通过将其作为最后一个 then 中的 reject 函数放在链的末尾,链中调用 reject 的任何 Promise 都将调用此函数一个。

现在我们对承诺更有信心了,让我们结合上面的承诺创建另一个承诺。我们将创建一个采用新的小写电子邮件地址的电子邮件地址,并(假装)向该地址发送电子邮件。这只是一个说明异步内容的示例 – 它可以是任何内容,例如联系服务器以查看电子邮件是否在白名单上或者用户是否已登录。我们需要将电子邮件地址提供给新的 Promise,但承诺不接受争论。解决这个问题的方法是将 Promise 包装在一个可以执行此操作的函数中,如下所示:

var sendEmail = function (emailAddress) {    return new Promise(function (resolve, reject) {        // Pretend to send an email        // or do something else asynchronous        setTimeout(function () {            resolve('Email sent to ' + emailAddress);        }, 3000);    });};

我们在此处使用 setTimeout 调用来简单地伪造一个需要几秒钟才能异步运行的任务。

那么我们如何使用新的承诺创建函数呢?好吧,由于在 then 中使用的每个 resolve 函数都应该返回一个函数,那么我们可以以与同步任务类似的方式使用它。

myPromise    .then(function (result) {        return JSON.parse(result);    })    .then(function (parsedJSON) {        return parsedJSON.email.toLowerCase();    })    .then(function (emailAddress) {        return sendEmail(emailAddress)    })    .then(function (result) {        // Outputs "Email sent to stuart@fakemail.biz"        console.log(result);    }, function (err) {        console.error(err);    });

让我们回顾一下这个流程,总结一下发生了什么。我们最初的 Promise myPromise 请求一段 JSON。当收到该 JSON 时(我们不知道何时),我们将 JSON 转换为 JavaScript 对象并返回该值。

完成后,我们从 JSON 中取出电子邮件地址并将其变为小写。然后我们向该地址发送一封电子邮件,同样我们不知道它何时完成,但当它完成时,我们将向控制台输出一条成功消息。看不到沉重的嵌套。

结论

我希望这是对 Promise 的有用介绍,并为您提供了在 JavaScript 项目中开始使用它们的充分理由。如果您想更详细地了解 Promise,请查看 Jake Archibald 关于这个主题的优秀 HTML5 Rocks 文章。

学习 JavaScript:完整指南

我们构建了一个完整的指南来帮助您学习 JavaScript,无论您是刚刚开始作为 Web 开发人员还是想探索更高级的主题。

以上就是JavaScript:恪守我们的承诺的详细内容,更多请关注创想鸟其它相关文章!

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

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
Javascript 程序检查两个数字是否是彼此的位循环
上一篇 2025年11月9日 12:21:10
《他趣》修改所在地方法
下一篇 2025年11月9日 12:21:23

相关推荐

  • MySQL数据库如何设计适合大数据量的表结构_案例分析?

    MySQL数据库如何设计适合大数据量的表结构_案例分析?MySQL数据库如何设计适合大数据量的表结构_案例分析?MySQL数据库如何设计适合大数据量的表结构_案例分析?MySQL数据库如何设计适合大数据量的表结构_案例分析?

    设计适合大数据量的mysql表结构,核心在于数据类型选对、索引用好、适当拆分。1. 合理选择字段类型,如根据数据范围选用tinyint/smallint代替bigint,固定值字段用enum类型,大文本字段单独拆表;2. 精准建立索引,高频查询字段建联合索引并遵循最左前缀原则,避免低区分度字段建索引…

    2026年9月21日 用户投稿
    100
  • 优酷怎么退出登录?-优酷退出登录的方法

    优酷视频作为当下广受欢迎的视频平台之一,许多用户在使用过程中会关心如何退出账号。那么,优酷如何退出登录?以下是详细的操作步骤,一起来看看吧! 优酷退出登录的具体方法 1、打开手机上的优酷应用,进入主界面后,点击底部菜单中的【我的】选项。 2、进入个人页面后,向下滑动屏幕,直到看到底部的【设置】入口,…

    2026年9月21日
    200
  • 余承东:三折叠能超越华为的只有华为

    9月4日,华为举行新品发布会,正式推出全球第二款商用三折叠手机——华为Mate XTs非凡大师。 继去年首发全球首款商用三折叠手机后,华为目前依然是行业内唯一实现三折叠手机量产并完成产品迭代的品牌。 华为常务董事、终端BG董事长余承东在会上强调:“三折叠能超越华为的只有华为。” 他表示,新机通过采用…

    2026年9月21日
    100
  • Java Random类如何生成随机数

    Random类位于java.util包,通过实例化生成伪随机数;无参构造以系统时间作种子,带参构造用固定种子可复现序列;提供nextInt()、nextDouble()等方法生成不同类型随机值;指定范围整数可用rand.nextInt(max-min)+min实现;多线程推荐ThreadLocalR…

    2026年9月21日
    100
  • VSCode怎么改环境_VSCode切换Python/Node等多版本环境教程

    切换VSCode环境需先安装对应语言扩展,再通过命令面板选择解释器或使用nvm切换Node版本,配合虚拟环境或launch.json配置确保运行和调试时使用正确版本,可通过终端命令验证环境,若失效可检查缓存、扩展冲突或权限问题。 VSCode改环境,其实就是让VSCode知道你想用哪个版本的Pyth…

    2026年9月21日
    000
  • OPPO A6 Pro官宣:开启手机六年耐用新时代

    9月4日,OPPO正式宣布将于9月9日下午14:30推出全新机型OPPO A6 Pro,标志着手机六年持久耐用新纪元的开启。 据官方预热内容显示,OPPO A6 Pro在防水、抗摔及整体耐久性方面实现全面升级,成为迄今为止OPPO A系列中性能最强大、防护能力最出色的机型。 回顾去年发布的OPPO …

    2026年9月21日
    000
  • 构建与调试PHP简易路由系统:从原理到实践

    本文将指导您如何从零开始构建一个基础的PHP路由系统,实现URL到控制器和方法的映射。我们将深入探讨$_SERVER[‘REQUEST_URI’]的解析、控制器文件的动态加载、方法调用以及如何通过.htaccess进行URL重写。同时,文章还将详细讲解常见的“未定义变量”错误…

    2026年9月21日
    100
  • windows10如何查看S.M.A.R.T.硬盘状态_windows10硬盘S.M.A.R.T.状态查看方法

    电脑运行慢、蓝屏或文件损坏可能是硬盘故障前兆,可通过S.M.A.R.T.技术检测健康状况。1、使用WMIC命令行工具输入“wmic diskdrive get model,status”查看状态,显示Pred Fail需立即备份数据;2、CrystalDiskInfo可深度分析S.M.A.R.T.参…

    2026年9月21日
    100
  • Photopea的AI功能怎么裁剪图片?快速实现高效图片裁剪技巧

    Photopea的AI功能怎么裁剪图片?快速实现高效图片裁剪技巧Photopea的AI功能怎么裁剪图片?快速实现高效图片裁剪技巧Photopea的AI功能怎么裁剪图片?快速实现高效图片裁剪技巧Photopea的AI功能怎么裁剪图片?快速实现高效图片裁剪技巧

    Photopea的AI功能通过智能选择工具与内容感知技术结合,实现高效图片裁剪。首先使用对象选择、快速选择或魔棒工具智能识别主体或背景,再通过“选择并遮住”精细调整边缘,尤其适用于复杂轮廓如发丝。随后可应用图层蒙版透明化背景,并用裁剪工具调整画布范围。结合内容感知填充可移除干扰元素并自动补全画面,内…

    2026年9月21日 用户投稿
    300
  • Sublime开发MySQL存储过程教程实战_封装重复逻辑减少前端负担

    Sublime开发MySQL存储过程教程实战_封装重复逻辑减少前端负担Sublime开发MySQL存储过程教程实战_封装重复逻辑减少前端负担Sublime开发MySQL存储过程教程实战_封装重复逻辑减少前端负担Sublime开发MySQL存储过程教程实战_封装重复逻辑减少前端负担

    在web开发中使用mysql存储过程能有效封装逻辑并减少前端负担,本文介绍了其优势、环境配置及实战技巧。一、存储过程的优势包括减少网络传输、提高性能、统一业务逻辑;二、sublime text配置步骤为安装package control、sublimerepl插件、sql语法高亮插件,并建议新建.s…

    2026年9月21日 用户投稿
    800
  • Linux中如何安装Redis_Linux安装Redis服务的完整教程

    安装编译环境和依赖:Ubuntu/Debian用apt安装build-essential tcl wget,CentOS/RHEL用yum安装Development Tools和tcl wget。2. 下载Redis 7.2.4源码包并%ignore_a_1%,进入目录后执行make编译,可选mak…

    2026年9月21日
    000
  • 小红书从哪里看私信记录?私信记录如何清理?

    在小红书上与朋友或喜欢的博主互动时,私信是必不可少的沟通方式。不少新手用户常常困惑于如何查找过往的聊天内容。本文将为你详细说明查看私信记录的具体步骤,并分享几种实用的清理方法,帮助你轻松管理私信箱,让对话界面更清爽。 一、如何找到小红书的私信记录? 查看私信的操作非常直观,只需几个简单步骤即可完成。…

    2026年9月21日
    000
  • 编译CEGUI「建议收藏」

    大家好,很高兴再次与你们见面,我是你们的老朋友全栈君。 平台: Windows 7 / 64位 / VS2005 CEGUI下载 地址:https://www.php.cn/link/9a2327a2fcc570914ce9c9e61581cbf8 源码选择: CEGUI 0.7.9 库源码下载 这…

    2026年9月21日
    000
  • 英睿达T700 4TB对决WD_BLACK SN850X 4TB:PCIe 5.0 SSD的连续读写,在实际游戏中加载速度差异明显吗?

    在绝大多数游戏加载场景中,英睿达T700 4TB与WD_BLACK SN850X 4TB速度差异不明显,因游戏加载受限于4K随机读取性能及系统瓶颈,而非连续读取速度;尽管T700峰值更高,但实际加载表现受CPU、内存和散热限制,SN850X已能满足需求。 直接说结论:在绝大多数实际游戏加载场景中,英…

    2026年9月21日
    100
  • VSCode代码空格怎么解决_VSCode缩进与格式处理教程

    解决VSCode代码空格和缩进问题,需配置settings.json中的缩进规则并引入外部格式化工具。首先设置”editor.tabSize”、”editor.insertSpaces”和”editor.detectIndentation&…

    2026年9月21日
    100
  • PHP框架中间件有什么用处_PHP框架中间件设计与实现

    PHP框架中间件是处理请求和响应的过滤器,用于实现身份验证、日志记录、CORS等通用逻辑,核心价值在于解耦和提升可维护性。通过定义中间件接口、具体中间件类及管道调度器可实现自定义中间件,如身份验证或CORS处理。在Laravel中可通过Kernel.php配置全局、分组或路由级中间件,执行顺序按注册…

    2026年9月21日
    000
  • 苹果手机4800万像素功能如何开启

    苹果手机4800万像素模式开启方法 若想使用苹果手机的4800万像素拍摄功能,首先需确认您的设备型号及系统版本是否支持该功能。进入手机“相机”应用后,前往系统设置中的“相机”选项,查找“分辨率”或“格式”相关设置。部分机型在此处会提供“HEIF高效率”或“ProRAW”选项,启用后可激活4800万像…

    2026年9月21日
    200
  • 52核+288MB缓存痛击AMD锐龙X3D Intel确认Nova Lake史上最强

    10月26日消息,在amd推出锐龙x3d家族处理器后,凭借超大容量的3d缓存实现了游戏性能的全面反超,成功登顶最强游戏cpu宝座。 过去,Intel酷睿处理器虽在多核性能上稍逊一筹,但在游戏领域始终占据主导地位。然而,随着X3D系列的强势崛起,这一最后的防线也被攻破。此前,Intel已公开承认其在桌…

    2026年9月21日
    000
  • Java中字符到数字转换:解决for循环提前返回的常见陷阱

    本文探讨java中`for`循环在字符到数字转换时,因`return`语句放置不当导致程序提前终止、无法完整处理字符串的问题。我们将分析这种常见陷阱,并提供修正方案,演示如何正确利用循环填充数组,并在循环结束后统一返回最终结果,确保每个字符都能被准确映射和组合。 引言:字符到数字的映射需求 在编程实…

    2026年9月21日
    000
  • 燕云十六声装备回收转流派技巧分享

    燕云十六声装备回收转流派技巧分享燕云十六声装备回收转流派技巧分享燕云十六声装备回收转流派技巧分享燕云十六声装备回收转流派技巧分享

    燕云十六声中,装备是角色变强的关键所在!武器、防具、饰品各具特色,品质更是分为绿、蓝、紫、金四个等级。想要高效提升战力、不浪费培养资源?那就必须掌握装备回收技巧与流派转换策略。具体怎么操作?继续往下看,实用攻略全解析助你轻松上手! 燕云十六声装备回收与转流派技巧指南 一、装备和武学的区别要分清 新手…

    2026年9月21日 用户投稿
    100

发表回复

登录后才能评论
关注微信