当前位置: 首页 > news >正文

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

在这里插入图片描述

如果阅读有疑问的话,欢迎评论或私信!!
本人会很热心的阐述自己的想法!谢谢!!!

文章目录

  • 回调中的信任问题
  • 回调给我们带来的烦恼?
    • 调用过早
    • 调用过晚
    • 调用的次数太少或太多
    • 调用回调时未能成功传入参数
    • 吞掉了可能出现的错误或异常
  • Promise链式流
  • 探索Promise异步模式抽象的变体——Promise.all篇

回调中的信任问题

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


//这里是现在要进行的代码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链式流

Promise中的链式流

探索Promise异步模式抽象的变体——Promise.all篇

探索Promise异步模式抽象的变体

相关文章:

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

如果阅读有疑问的话,欢迎评论或私信!! 本人会很热心的阐述自己的想法!谢谢!!! 文章目录 回调中的信任问题回调给我们带来的烦恼?调用过早调用过晚调用的次数太少或太多调用回调时未能…...

如何选择最适合的图纸加密软件?用户体验及性价比

安秉网盾图纸加密软件是一款功能强大的图纸加密工具,具有以下特点和优势: 全盘加密:安秉网盾采用先进的加密算法,能对文件、文件夹、磁盘等数据进行全面加密,确保数据在存储和传输过程中的安全性。 监控与审计&#…...

一分钟学会MobaXterm当Linux客户端使用

一、介绍 MobaXterm是一款功能强大的远程计算机管理工具,它集成了各种网络工具和远程连接协议,可以帮助用户在Windows系统上轻松管理远程计算机。MobaXterm支持SSH、Telnet、RDP、VNC等多种远程连接协议,同时还集成了X11服务器,可…...

2024-02-21 算法: 测试链表是否有环

点击 <C 语言编程核心突破> 快速C语言入门 算法: 测试链表是否有环 前言一、双指针 ( 快慢指针 )二、代码总结 前言 要解决问题: 一道简单的算法题, 测试链表是否含有环. 想到的思路: 哈希表, 将链表指针强制转换为整型, 利用求余法建立哈希函数. 太复杂, 内存效率不高…...

http协议工具:apache详解

目录 一、常见的http服务程序 1、 Apache HTTP Server 介绍 1.1 apache 概念 1.2 apache 功能 1.3 apache 特性 2、MPM&#xff08;multi-processing module&#xff09;工作模式 2.1 prefork 2.2 worker 2.3 event 二、Apache HTTP Server安装和相关文件 1、安装方…...

我的NPI项目之Android Camera (二) -- 核心部件之 Camera Sensor

说到Camera模组&#xff0c;我们比较关心的是用的什么样的sensor&#xff1f; sensor的分辨率多少&#xff0c;sensor的像素多大&#xff0c;sensor是哪家生产的等等一些问题。今天&#xff0c;我们就穿越时间&#xff0c;将sensor的历史扒一扒。 Wikipedia先看一下&#xff1…...

【四】3D Object Model之测量Features——get_object_model_3d_params()算子

&#x1f60a;&#x1f60a;&#x1f60a;欢迎来到本博客&#x1f60a;&#x1f60a;&#x1f60a; &#x1f31f;&#x1f31f;&#x1f31f; Halcon算子太多&#xff0c;学习查找都没有系统的学习查找路径&#xff0c;本专栏主要分享Halcon各类算子含义及用法&#xff0c;有…...

C++学习Day09之系统标准异常

目录 一、程序及输出1.1 系统标准异常示例1.2 标准异常表格 二、分析与总结 一、程序及输出 1.1 系统标准异常示例 #include<iostream> using namespace std; #include <stdexcept> // std 标准 except 异常class Person { public:Person(int age){if (age <…...

企业计算机服务器中了crypt勒索病毒怎么办,crypt勒索病毒解密数据恢复

计算机服务器设备为企业的生产运营提供了极大便利&#xff0c;企业的重要核心数据大多都存储在计算机服务器中&#xff0c;保护企业计算机服务器免遭勒索病毒攻击&#xff0c;是一项艰巨的工作任务。但即便很多企业都做好的了安全运维工作&#xff0c;依旧免不了被勒索病毒攻击…...

npm详解:掌握package.json配置

package.json 文件中的 scripts 配置允许你定义一系列脚本命令&#xff0c;这些命令可以通过 npm run <script-name> 来执行。下面是一些常见的 scripts 配置&#xff0c;以及它们的详解和举例。 常见的 scripts 配置 start 这是最常用的脚本&#xff0c;通常用于启动应…...

Git基础操作

1、git 基础命令 //克隆远端仓库 git clone http://dddddd.git //初始化仓库 git init //查看状态 git status //添加所有文件到缓存区 git add . //查看版本日志 git reflog //将更新提交到本地仓库 git commit -m "日志摘要" //将当前版本回退到某个版本 git rese…...

怎么卸载Nvidia显卡驱动

在Ubuntu 22.04上卸载Nvidia显卡驱动并手动重新安装的步骤可以分为几个主要部分。请确保在执行这些步骤之前&#xff0c;你已经备份了重要的数据&#xff0c;以防出现任何问题。 卸载当前的Nvidia驱动 打开终端&#xff1a;你可以通过按CtrlAltT快捷键来打开终端。 查找安装的…...

JS进阶——解构赋值

数组解构 基本&#xff1a; let [a, b, c] [1, 2, 3]; // a 1 // b 2 // c 3 可嵌套 let [a, [[b], c]] [1, [[2], 3]]; // a 1 // b 2 // c 3 可忽略 let [a, , b] [1, 2, 3]; // a 1 // b 3 不完全解构 let [a 1, b] []; // a 1, b undefined 剩余运…...

[Flask]SSTI1 buuctf

声明&#xff1a;本篇文章csdn要我一天发两篇所以我来水的 跟ssti注入的详细知识我这里写了 https://blog.csdn.net/weixin_74790320/article/details/136154130 上面链接我复现了vulhub的SSTI&#xff0c;其实本质上是一道题 然后我们就用{{.__class__}}看类的类型&#xf…...

k8s学习整理文档

整理文档 ‍ ‍ 实验环境 服务器 最低配置要求: 2 核虚拟 CPU4 GB 内存20 GB 储存空间X 4 台 (三台集群,一台镜像仓库服务器) 网络环境 由于搭建网络需要,同时要让各个主机互通,因此这里需要对云服务器设置专门的网络(同时也需要开放服务器对应的公网 IP) 在云…...

git----->git pull和git fetch区别

git pull 和 git fetch 是 Git 中两个常用的命令&#xff0c;它们都用于从远程仓库获取最新的内容。然而&#xff0c;它们的行为有所不同&#xff1a; git fetch: git fetch 命令用于从远程仓库获取最新的历史记录和数据&#xff0c;但它不会自动合并或修改你当前的工作。它只是…...

如何使用Docker部署MongoDB并结合内网穿透实现远程访问本地数据库

文章目录 前言1. 安装Docker2. 使用Docker拉取MongoDB镜像3. 创建并启动MongoDB容器4. 本地连接测试5. 公网远程访问本地MongoDB容器5.1 内网穿透工具安装5.2 创建远程连接公网地址5.3 使用固定TCP地址远程访问 正文开始前给大家推荐个网站&#xff0c;前些天发现了一个巨牛的 …...

适用于 Windows 的 12 个最佳 PDF 编辑器

PDF文档的普遍存在按理说&#xff0c;PDF文档的可读性和可移植性受到专业文档的青睐。 然而&#xff0c;PDF格式的可食用性是一大缺陷。幸运的是&#xff0c;各种 PDF 编辑工具和软件使 PDF 的编辑变得更加容易&#xff0c;这篇文章旨在帮助我们的读者找到其中最好的工具和软件…...

C++面试:SQL注入、web shell攻击的危害和规避方法

目录 SQL注入 工作原理 危害 规避方法 示例背景 Web Shell攻击 工作原理 危害 规避方法 SQL注入和Web Shell攻击是两种常见的网络安全威胁&#xff0c;它们可以对系统造成严重的危害。了解它们的工作原理、危害以及如何规避是网络安全防护的基本要求。下面将详细介绍这…...

计算机网络基础之计算机网络组成与分类

计算机网络基础 计算机网络是计算机技术与通信技术发展相结合的产物&#xff0c;并在用户需求的促进下得到进一步的发展。通信技术为计算机之间的数据传输和交换提供了必需的手段&#xff0c;而计算机技术又渗透到了通信领域&#xff0c;提高了通信网络的性能。 计算机网络的…...

React 第五十五节 Router 中 useAsyncError的使用详解

前言 useAsyncError 是 React Router v6.4 引入的一个钩子&#xff0c;用于处理异步操作&#xff08;如数据加载&#xff09;中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误&#xff1a;捕获在 loader 或 action 中发生的异步错误替…...

Linux 文件类型,目录与路径,文件与目录管理

文件类型 后面的字符表示文件类型标志 普通文件&#xff1a;-&#xff08;纯文本文件&#xff0c;二进制文件&#xff0c;数据格式文件&#xff09; 如文本文件、图片、程序文件等。 目录文件&#xff1a;d&#xff08;directory&#xff09; 用来存放其他文件或子目录。 设备…...

【力扣数据库知识手册笔记】索引

索引 索引的优缺点 优点1. 通过创建唯一性索引&#xff0c;可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度&#xff08;创建索引的主要原因&#xff09;。3. 可以加速表和表之间的连接&#xff0c;实现数据的参考完整性。4. 可以在查询过程中&#xff0c;…...

IGP(Interior Gateway Protocol,内部网关协议)

IGP&#xff08;Interior Gateway Protocol&#xff0c;内部网关协议&#xff09; 是一种用于在一个自治系统&#xff08;AS&#xff09;内部传递路由信息的路由协议&#xff0c;主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

YSYX学习记录(八)

C语言&#xff0c;练习0&#xff1a; 先创建一个文件夹&#xff0c;我用的是物理机&#xff1a; 安装build-essential 练习1&#xff1a; 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件&#xff0c;随机修改或删除一部分&#xff0c;之后…...

汽车生产虚拟实训中的技能提升与生产优化​

在制造业蓬勃发展的大背景下&#xff0c;虚拟教学实训宛如一颗璀璨的新星&#xff0c;正发挥着不可或缺且日益凸显的关键作用&#xff0c;源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例&#xff0c;汽车生产线上各类…...

稳定币的深度剖析与展望

一、引言 在当今数字化浪潮席卷全球的时代&#xff0c;加密货币作为一种新兴的金融现象&#xff0c;正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而&#xff0c;加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下&#xff0c;稳定…...

Python ROS2【机器人中间件框架】 简介

销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...

RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill

视觉语言模型&#xff08;Vision-Language Models, VLMs&#xff09;&#xff0c;为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展&#xff0c;机器人仍难以胜任复杂的长时程任务&#xff08;如家具装配&#xff09;&#xff0c;主要受限于人…...

数学建模-滑翔伞伞翼面积的设计,运动状态计算和优化 !

我们考虑滑翔伞的伞翼面积设计问题以及运动状态描述。滑翔伞的性能主要取决于伞翼面积、气动特性以及飞行员的重量。我们的目标是建立数学模型来描述滑翔伞的运动状态,并优化伞翼面积的设计。 一、问题分析 滑翔伞在飞行过程中受到重力、升力和阻力的作用。升力和阻力与伞翼面…...