Pormise---如何解决javascript中回调的信任问题?【详解】

在这里插入图片描述

本人编程小白一枚,希望多多包涵~
如果阅读有疑问的话,欢迎评论或私信!!
本人会很热心的阐述自己的想法!谢谢!!!

文章目录

  • 回调中的信任问题
  • 回调给我们带来的烦恼?
    • 调用过早
    • 调用过晚
    • 调用的次数太少或太多
    • 调用回调时未能成功传入参数
    • 吞掉了可能出现的错误或异常
    • Promise链式流(未完待续……)

回调中的信任问题

什么是信任问题?先看下面的代码!


//这里是现在要进行的代码1ajax("...",function(){//这是是将来要执行的代码2})//这里是现在要进行的代码3

我们从1执行到3,中间的2交给了ajax进行回调,但是我们不知道ajax会什么时候调用。代码1之后?还是代码3之后?或许代码3的可能性更大一些,但是也不排除代码1的小概率事件,毕竟不是我们所能控制的。

上面中的情况我们会叫做控制反转(inversion of control),总而言之,意思就是把自己代码的控制权交给了第三方。

回调给我们带来的烦恼?

调用过早

我们可能打算在代码3执行完之后再让代码2执行。在上面的代码中,我们可以看到,代码2可能在代码3之前运行,这种情况就属于调用过早

我们通常会使用setTimeout(“…” , 0 )使这段代码中的语句立即执行,但是如今在ES6中,Promise帮我们已经解决了这个问题,不再需要自行设置hack。

调用过晚

调用过晚意思是我们有时希望代码2可以在代码3之前执行完毕,但是真实结果可能是代码2在代码3之后执行的概率更大些。

这种情况我们称之为调用过晚。

调用过早调用过晚使得我们的代码具有二义性,在编写程序时,我们无法准确控制代码执行的时间,也无法将执行时间提前。但是我们可以将代码的执行统一后退,将对代码决议完之后的结果统一执行!Promise就是这么做的!!

回调调用过晚,导致未调用

这种情况也属于调用过晚,或许因为代码中存在javascript错误,亦或者是其他错误导致。而在ES6中的Promise,没有任何东西可以阻止Promise的决议。Promise总会调用其自身的完成回调或拒绝回调的其中一个方法。

如果Promise本身永远不被决议呢?

Promise提供了一种成为竞态的高级抽象机制:Promise.race()
该方法的参数为一个数组,数组中可以是Promise构造器,亦可以是立即值。在该方法中,都会通过Promise.resolve()过滤。在数组中可以设置如下代码设置超时,引起拒绝回调。

function timeoutPromise(delay){return new Promise(function(resolve,reject){setTimeout(function(){reject("超时了");},delay)})
})

调用的次数太少或太多

调用次数太少是指前面的未调用,在回调中,次数最少可以为1次。

调用次数过多,是指回调被频繁引用,例如:设置的定时器过多…

在Promise中,每个决议只能被决议一次,无论后续再怎么调用,也只能得到相同的决议值。

调用回调时未能成功传入参数

要强调一句,Promise只能有一个决议值!

如果Promise没有显示决议,那么这个决议值是undefined,例如下面这个代码:

var  p = new Promise(function(resolve,reject){resolve();})p.then(function fulfilled(msg){console.log(msg);	//undefined},function rejected(err){console.error(err);})

这里resolve并没有传递参数。

tip:如果多个参数调用resolve(…)或者reject(…),除了第一个参数被传入Promise中,其他参数会被默默忽略。如果要传入多个参数,只能使用对象一个数组的形式传入。

吞掉了可能出现的错误或异常

我们先来看一下下面的代码!

var  p = new Promise(function(resolve,reject){foo.bar();resolve(1);})p.then(function fulfilled(msg){console.log(msg)},function rejected(err){console.error(err)})

在这个例子中,我们会看到控制台打印出了下面这个错误:

ReferenceError: foo is not defined
at test.html:15:7
at new Promise ()
at test.html:14:14

由上所示:在出现javascript错误时,Promise会默认调用了拒绝回调

我们再看一个相似的代码:

var  p = new Promise(function(resolve,reject){resolve(1);})p.then(function fulfilled(msg){foo.bar();console.log(msg)},function rejected(err){console.error(err)})

在这个例子中,我们会看到控制台打印出了下面这个错误:

Uncaught (in promise) ReferenceError: foo is not defined
at fulfilled (test.html:19:7)

Uncaught中文意思是未能捕获,即该异常没有被处理。通常我们可能会想,为什么Promise检测到异常后不调用下面的rejected函数? 因为Promise有一个 重要原则:决议值一次决议,不会更改。我们不能因为爆出了异常,就使得该决议值成为了rejected。

解决该方法通常采用注册处理函数的方式解决,即在尾部使用catch()。该方法相当于以下代码:

catch = new Promise(function(resolve,reject){reject();
})

Promise链式流(未完待续……)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/695320.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【深度学习:对象跟踪】对象跟踪完整指南 [教程]

【深度学习:对象跟踪】对象跟踪完整指南 [教程] 什么是计算机视觉中的对象跟踪?对象跟踪有哪些不同类型?图像跟踪视频跟踪单目标跟踪多对象跟踪 计算机视觉中对象跟踪的用例监测零售自动驾驶汽车医疗保健 对象跟踪方法步骤 1:目标…

客户端web开发工具

文章目录 安全网络Linter-->捕获代码错误-->eslint源代码控制-->Git代码格式化-->Prettier打包工具--Parcel--Webpack 转换--Babel开发后阶段测试工具配置工具其他 node,npm、yarnnode.js包管理器npmyarn https://developer.mozilla.org/zh-CN/docs/Lea…

安卓系统和iOS系统的手机备忘录同步数据方法

在这个智能手机时代,安卓与iOS系统犹如两位王者,各自拥有庞大的用户群体。有人钟情于安卓的开放与多样,有人偏爱iOS的流畅与稳定。甚至,有些人为了满足不同需求,同时使用着两个系统的手机。我就是其中的一员。 工作中…

攻防世界-web-Training-WWW-Robots

题目信息 In this little training challenge, you are going to learn about the Robots_exclusion_standard. The robots.txt file is used by web crawlers to check if they are allowed to crawl and index your website or only parts of it. Sometimes these files rev…

你正在读的书,暴露了你的阶层!丰富自己吧!——早读

明天大概率可以看鸽子了 引言Python代码第一篇 人民日报 全网等的图来了!当故宫“遇上”龙年初雪第二篇 人民日报【夜读】一个人最好的生活方式,是丰富自己第三篇(跳) 洞见 你正在读的书,暴露了你的阶层第四篇&#xf…

Maven私服搭建Nexus3

第一部分:仓库部署 下载地址:https://help.sonatype.com/en/download.html 备用下载链接,部分已经失效了 解压后会有两个文件夹: nexus-3.20.1-01 sonatype-work 访问地址配置路径 \nexus-3.20.1-01\bin\nexus.vmoptions -Xms1…

喀秋莎画中画怎么设置 喀秋莎画中画视频怎么导出 喀秋莎什么意思 camtasia studio下载

画中画视频,顾名思义,就是在一个视频中有两个画面,游戏解说、微课等类型的视频常常就以画中画的形式出现。作为一款专业的视频编辑软件,使用camtasia可以轻松地制作画中画视频并导出。接下来我将为大家介绍:喀秋莎画中…

每日coding 337打家劫舍III

337. 打家劫舍 III 小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为 root 。 除了 root 之外,每栋房子有且只有一个“父“房子与之相连。一番侦察之后,聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”。…

【Linux】日志命令行练习(持续更新)

文章目录 前言环境情景1. 获取实时日志2. 关键字定位3. 关键字取并集4. 关键字取交集5. 关键字取差集6. 关键字实时日志捕获7. 关键词上下文打印8. 关键词滚动搜索9. 看最早的日志信息 前言 公司生产问题需要登录堡垒机排查。 没有日志平台的情况下,生产问题同样要…

【Linux】自主WEB服务器实现

自主web服务器实现 1️⃣构建TcpServer2️⃣构建HttpServer3️⃣构建HttpRequest和HttpResponseHttp请求报文格式Http相应报文读取、处理请求&构建响应读取请求中的一行读取请求中需要注意的点 4️⃣CGI模式判断是否需要用CGI处理请求构建任务&线程池管理 5️⃣实验结果…

《图解设计模式》笔记(二)交给子类

三、Template Method模式:将具体处理交给子类 示例程序类图 public static void main(String[] args) {// 生成一个持有H的CharDisplay类的实例AbstractDisplay d1 new CharDisplay(H);// 生成一个持有"Hello, world."的StringDisplay类的实例AbstractD…

C++ Linux多线程

1. C语言线程安全问题 1.1 线程安全问题 #include <stdio.h> #include <tinycthread.h> #include <io_utils.h>int count 0; int Counter(void*arg) {for(int i 0;i<100000;i){count;/** int temp count;* counttemp1;* return temp;* */}return 0; …

大模型训练流程(三)奖励模型

为什么需要奖励模型 因为指令微调后的模型输出可能不符合人类偏好&#xff0c;所以需要利用强化学习优化模型&#xff0c;而奖励模型是强化学习的关键一步&#xff0c;所以需要训练奖励模型。 1.模型输出可能不符合人类偏好 上一篇讲的SFT只是将预训练模型中的知识给引导出来…

Vue+SpringBoot打造大学兼职教师管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容三、界面展示3.1 登录注册3.2 学生教师管理3.3 课程管理模块3.4 授课管理模块3.5 课程考勤模块3.6 课程评价模块3.7 课程成绩模块3.8 可视化图表 四、免责说明 一、摘要 1.1 项目介绍 大学兼职教师管理系统&#xff0c;旨…

基于 QUIC 协议的 HTTP/3 正式发布!

近期&#xff0c;超文本传输协议新版本 HTTP/3 RFC 文档&#xff0c;已由互联网工程任务组&#xff08;IETF&#xff09;对外发布。HTTP/3 全称为 HTTP-over-QUIC&#xff0c;指在 QUIC&#xff08;Quick UDP Internet Connections, 快速 UDP 互联网连接&#xff09;上映射 HTT…

基于Java+小程序点餐系统设计与实现(源码+部署文档)

博主介绍&#xff1a; ✌至今服务客户已经1000、专注于Java技术领域、项目定制、技术答疑、开发工具、毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精彩专栏 推荐订阅 &#x1f447;&#x1f3fb; 不然下次找不到 Java项目精品实…

如何使用CanaryTokenScanner识别Microsoft Office文档中的Canary令牌和可疑URL

关于CanaryTokenScanner CanaryTokenScanner是一款功能强大的Canary令牌和可疑URL检测工具&#xff0c;该工具基于纯Python开发&#xff0c;可以帮助广大研究人员快速检测Microsoft Office和Zip压缩文件中的Canary令牌和可疑URL。 在网络安全领域中&#xff0c;保持警惕和主动…

Leo赠书活动-17期 《基础软件之路:企业级实践及开源之路》

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; 赠书活动专栏 ✨特色专栏&#xff1a;…

【网站项目】167校园失物招领小程序

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

Day10_面向对象-抽象类-接口-课后练习-参考答案

文章目录 代码编程题第1题第2题第3题 代码编程题 第1题 知识点&#xff1a;抽象类语法点&#xff1a;继承&#xff0c;抽象类按步骤编写代码&#xff0c;效果如图所示&#xff1a; 编写步骤&#xff1a; 定义抽象类A&#xff0c;抽象类B继承A&#xff0c;普通类C继承BA类中&…