位置: 编程技术 - 正文

JavaScript中的Promise使用详解(JavaScript中的数据类型)

编辑:rootadmin

推荐整理分享JavaScript中的Promise使用详解(JavaScript中的数据类型),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:JavaScript中的变量名不区分大小写,JavaScript中的数据类型分哪为两大类?,JavaScript中的数据类型分哪为两大类?,JavaScript中的this指向,JavaScript中的方法名不区分大小写,JavaScript中的变量名不区分大小写,JavaScript中的方法名不区分大小写,JavaScript中的NaN代表什么,内容如对您有帮助,希望把文章链接给更多的朋友!

许多的语言,为了将异步模式处理得更像平常的顺序,都包含一种有趣的方案库,它们被称之为promises,deferreds,或者futures。JavaScript的promises ,可以促进关注点分离,以代替紧密耦合的接口。 本文讲的是基于Promises/A 标准的JavaScript promises。 执行规则 多个远程验证 超时处理 远程数据请求 动画 将事件逻辑从应用逻辑中解耦 消除回调函数的恐怖三角 控制并行的异步操作

JavaScript promise是一个承诺将在未来返回值的对象。是具有良好定义的行为的数据对象。promise有三种可能的状态:

Pending(待定) Rejected(拒绝) Resolved(已完成)

一个已经拒绝或者完成的承诺属于已经解决的。一个承诺只能从待定状态变成已经解决的状态。之后,承诺的状态就不变了。承诺可以在它对应的处理完成之后很久还存在。也就是说,我们可以多次取得处理结果。我们通过调用promise.then()来取得结果,这个函数一直到承诺对应的处理结束才会返回。我们可以灵活的串联起一堆承诺。这些串联起来的“then”函数应该返回一个新的承诺或者最早的那个承诺。通过这个样式,我们可以像写同步代码一样来写非同步代码。主要是通过组合承诺来实现:

堆栈式任务:多处散落在代码中的,对应同一个承诺。 并行任务:多个承诺返回同一个承诺。 串行任务:一个承诺,然后接着执行另一个承诺。 上面几种的组合。

为什么要这么麻烦?只用基本的回调函数不行吗?

回调函数的问题

回调函数适合简单的重复性事件,例如根据点击来让一个表单有效,或者保存一个REST调用的结果。回调函数还会使代码形成一个链,一个回调函数调用一个REST函数,并为REST函数设置一个新的回调函数,这个新的回调函数再调用另一个REST函数,依此类推。代码的横向增长大于纵向的增长。回调函数看起来很简单,直到我们需要一个结果,而且是立刻就要,马上就用在下一行的计算中。

我使用timeout来模拟异步操作。管理异常的方法是痛苦的,很容易玩漏下游行为。当我们编写回调,那么代码组织变得混乱。图2显示了一个模拟验证流可以运行在NodeJS REPL。在下一节,我们将从pyramid-of-doom模式迁移到一个连续的promise。

Figure

在NodeJS REPL执行的结果

我曾经遇到一个AngularJS动态验证的情况,根据对应表的值,动态的限制表单项的值。限制项的有效值范围被定义在REST服务上。

我写了一个调度器,根据请求的值,去操作函数栈,以避免回调嵌套。调度器从栈中弹出函数并执行。函数的回调会在结束时重新调用调度器,直到栈被清空。每次回调都记录所有从远程验证调用返回的验证错误。

我认为我写的玩意儿是一种反模式。如果我用Angular的$http调用提供的promise,在整个验证过程中我的思维会更近似线性形式,就像同步编程。平展的promise链是可读的。继续... 使用Promises

其中采用了kew promise库。Q库同样适用。要使用该库,首先使用npm将kew库导入到NodeJS,然后加载代码到NodeJS REPL。

Figure

JavaScript中的Promise使用详解(JavaScript中的数据类型)

输出和使用嵌套回调时相同:

该代码稍微“长高”了,但我认为更易于理解和修改。更易于加上适当的错误处理。在链的末尾调用fail用于捕获链中错误,但我也可以在任何一个then里面提供一个reject的处理函数做相应的处理。

服务器 或 浏览器

Promises在浏览器中就像在NodeJS服务器中一样有效。下面的地址, JSFiddle所有的代码是可修改的。我故意操作随意动作。你可以试几次得到相反的结果。它是可以直接扩展到多个promise链, 就像前面NodeJS例子。

并行 Promises

考虑一个异步操作喂养另一个异步操作。让后者包括三个并行异步行为,反过来,喂最后一个行动。只有当所有平行的子请求通过才能通过。这是灵感来自偶遇一打MongoDB操作。有些是合格的并行操作。我实现了promises的流流程图。

我们怎么会模拟那些在该图中心行的并行promises?关键是,最大的promise库有一个全功能,它产生一个包含一组子promises的父promie。当所有的子promises通过,父promise通过。如果有一个子promise拒绝,父promise拒绝。

让十个并行的promises每个都包含一个文字promise。只有当十个子类通过或如果任何子类拒绝,最后的then方法才能完成。

Figure

下面的地址, Promise

许多api返回的promise都有一个then函数——他们是thenable。通常我只是通过then处理thenable函数的结果。然而,$q,mpromise,和kew库拥有同样的API用于创建,拒绝,或者通过promise。这里有API文档链接到每个库的引用部分。我通常不需要构造一个promise,除了本文中的包装promise的未知描述和timeout函数。请参考哪些我创建的promises。

Promise库互操作

大多数JavaScript promise库在then级别进行互操作。你可以从一个外部的promise创建一个promise,因为promise可以包装任何类型的值。then可以支持跨库工作。除了then,其他的promise函数则可能不同。如果你需要一个你的库不包含的函数,你可以将一个基于你的库的promise包装到一个新的,基于含有你所需函数的库创建的promise里面。例如,JQuery的promise有时为人所诟病。那么你可以将其包装到Q,$q,mpromise,或者kew库的promise中进行操作。 结语

现在我写了这篇文章,而一年前我却是犹豫要不要拥抱promise的那个。我只是单纯地想完成一项工作。 我不想学习新的API,或是打破我原来的代码(因为误解了promise)。我曾经如此错误地认为!当我下了一点注时,就轻易就赢得了可喜的成果。

在这篇文章中,我已经简单给出了一个单一的promise,promise链,和一个并行的promise的promise的的例子。 Promises不难使用。如果我可以使用它们,任何人都可以。 要查看完整的概念,我支持你点击专家写的参考指南。从Promises/A 的参考开始,从事实上的标准JavaScript的Promise 开始。

JavaScript面对国际化编程时的一些建议 什么是国际化?国际化(Internationalization的缩写是in——i,中间个字符,n)是将软件处理的能让来自各种地方使用各种语言的用户更简单使用的一个过

对JavaScript客户端应用编程的一些建议 你可能注意到了,最近的一段时间越来越多的Web应用有变复杂的趋势,重心从服务端慢慢向着客户端转移。这是个正常的趋势么?我不知道。支持和反

详解JavaScript的策略模式编程 我喜欢策略设计模式。我尽可能多的试着去使用它。究其本质,策略模式使用委托去解耦使用它们的算法类。这样做有几个好处。他可以防止使用大条

标签: JavaScript中的数据类型

本文链接地址:https://www.jiuchutong.com/biancheng/380455.html 转载请保留说明!

上一篇:对JavaScript的全文搜索实现相关度评分的功能的方法(javascript的对象有哪些)

下一篇:对JavaScript客户端应用编程的一些建议(javascript在客户端执行)

  • 个体户开电子税务局流程
  • 税务是怎么回事
  • 私车公用报销流程怎么写
  • 买交强险需要把车开过去吗
  • 销项税额是开票金额么
  • 未能确认收入的原因
  • 航空公司能开电动车吗
  • 非生产性费用不应计入产品成本
  • 资产损失税前扣除管理办法
  • 报废过期产品怎么做会计分录
  • 企业发生事故后的处理流程
  • 高温费计税吗
  • 财付通支付备付金还到信用卡里怎么办
  • 其他人挂靠公司交社保会计处理怎么做?
  • 房屋租赁合同税率怎么算
  • 季度交的企业所得税怎么做账
  • 非金融机构借款计入什么科目
  • 税务分析最常用的分析方法
  • 个人所得税可以抵扣哪些费用
  • 购买国债逆回购有股东限制
  • 增值税计入无形资产的入账价值吗?
  • 三免三减半税收优惠政策文件
  • 虚开增值税专用发票案例
  • 支付行业招商方案
  • 折旧是属于公司成本吗
  • 网卡运行异常
  • 苹果Mac系统怎么切换输入法
  • 认缴制没有实资本会怎么样
  • 生产运维是干什么的
  • 企业注销时实收资本需要交税吗
  • 财务如何核对会计信息
  • 远期外汇交易会有风险吗
  • 特征融合add
  • 公司为员工代扣代缴
  • 个人完税证明有什么用途
  • springcloud分布式微服务组件
  • python线程和协程
  • mongodb4
  • 房地产公司计提税金
  • 机关党建经费提取比例
  • 酌量性固定成本是指
  • PostgreSQL管理工具phpPgAdmin入门指南
  • 自行建造的固定资产达到预定可使用状态
  • 所得税交多了怎么留抵
  • 会计上视同销售的八种情况是哪些?
  • 定期定额个体工商户怎么报税
  • 哪些进项发票不能认证
  • 出口退税没有进项就退不了税吗?
  • 查出以前年度的虚开发票,如何补税
  • 国家资产负债表
  • 空档期太长是不是很难找工作
  • 研发支出资本化支出在资产负债表哪里体现
  • win2008安装sql2005
  • 怎么用sql脚本创建数据库
  • sqlserver存储过程实例详解
  • solaris newfs
  • ubuntu xenial
  • ubuntu系统软件安装
  • linux fdb表
  • linux大于符号
  • win8资源管理器未响应
  • win8.1无线
  • win10系统的电脑
  • 批处理怎么用
  • unity mrt
  • node js连接数据库
  • angular.js
  • 使用jquery实现的项目
  • linux python gui
  • 安装了python2.7和3.6怎么切换版本
  • Optimizing Unity Games for Mobile Platforms
  • 动态效果怎么设置
  • 常见的java数据类型有哪些
  • android 布局属性大全
  • jquery滚动条滚动到指定位置
  • 怎么查询地方规划用地
  • 税率的计算器在线计算
  • 鄞江在哪里
  • 昆明国家高新技术产业开发区管理委员会官方门户网站
  • 在烟台如何发布招聘信息
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设