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异步模式抽象的变体

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

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

相关文章

【在python中import包】解决方案:使用脚本中sys.path.append(到当前路径的str),将包的父目录添加到sys目录中

python脚本中的sys.path.append("…")详解 前言 当我们导入一个模块时: import xxx ,默认情况下python解释器会搜索当前目录、已安装的内置模块和第三方模块。 搜索路径存放在sys模块的path中。【即默认搜索路径可以通过sys.path打印查看】 sy…

YOLOv9来咧!

文章目录 论文:主要内容一、提出使用PGI(Programmable Gradient Information,可编程梯度信息)来解决信息瓶颈问题和深度监督机制不适合轻量级神经网络的问题。二、设计了GELAN(Generalized ELAN ,广义ELAN)…

Android 仿信号格子强度动画效果实现

效果图 在 Android 中,如果你想要绘制一个圆角矩形并使其居中显示,你可以使用 Canvas 类 drawRoundRect 方法。要使圆角矩形居中,你需要计算矩形的位置,这通常涉及到确定矩形左上角的位置(x, y)&#xff0…

性能全面提升!探索ONLYOFFICE最新8.0版:更快速、更强大,PDF表单编辑轻松搞定!

文章目录 PDF表单功能表单模板 屏幕朗读器功能EXCEL新增功能单变量求解图表向导数字排序 PPT 新增功能新增语言区域设置和优化插件界面 ONLYOFFICE 是由 Ascensio System SIA 推出的一款功能强大的办公套件,其中提供了适用于文本文档、表格以及演示文稿的在线编辑软…

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

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

C++ Primer 笔记(总结,摘要,概括)——第5章 语句

目录 5.1 简单语句 5.2 语句作用域 5.3 条件语句 5.3.1 if语句 5.3.2 switch语句 5.4 迭代语句 5.4.1 while语句 5.4.2 传统的for语句 5.4.3 范围for语句 5.4.4 do while语句 5.5 跳转语句 5.5.1 break语句 5.5.2 continue语句 5.5.3 goto语句 5.6 try语句块和异常处理 5…

OpenWRT部署web站点并结合内网穿透实现无公网ip远程访问

文章目录 前言1. 检查uhttpd安装2. 部署web站点3. 安装cpolar内网穿透4. 配置远程访问地址5. 配置固定远程地址 前言 uhttpd 是 OpenWrt/LuCI 开发者从零开始编写的 Web 服务器,目的是成为优秀稳定的、适合嵌入式设备的轻量级任务的 HTTP 服务器,并且和…

APP被针对攻击了,要怎么解决

随着APP行业的兴起,游戏公司异军突起,不管是在控证还是攻击方面都是属于最复杂的一个场面,游戏APP逐渐成为DDOS流量攻击的“重灾区”。没有提前做好了解就盲目进军游戏APP行业,一旦被攻击就会让公司束手无策。那么,刚上…

Spring Framework

Spring Framework Spring 是一款开源的轻量级 Java 开发框架,旨在提高开发人员的开发效率以及系统的可维护性。 Spring 框架指的都是 Spring Framework,它是很多模块的集合,如下图所示: 一、Core Container Spring 框架的核心模…

电脑恢复删除数据的原理和方法

在恢复数据的时候,很多人都会问,为什么删除的数据还能恢复?本篇和大家一起了解下硬盘上数据的存储方式,文件被删除的时候具体发生了什么,帮助大家理解数据恢复的基本原理。最后还会分享一个好用的数据恢复工具并附上图…

恒峰|高压森林应急消防泵|守护森林安全

森林是地球的肺腑,是人类赖以生存的重要资源。然而,随着人类活动的增加,森林火灾频发,给生态环境和人类生活带来严重威胁。为了保护森林资源,我们必须采取有效的措施进行消防。高压森林应急消防泵作为一种高效、环保的…

Kubernetes 部署 Tekton-Operator

Tekton Operator 简介 Tekton Operator 是一个 Kubernetes 扩展,用于在任何 Kubernetes 集群上安装、升级和管理 TektonCD Pipelines, Dashboard, Triggers(和其他组件)。 官方文档:https://tekton.dev/docs/operator/ 项目地址…