位置: 编程技术 - 正文

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在客户端执行)

  • 纳税人期末存货怎么结转
  • 税务零申报是什么意思情况
  • 年前一个月工资年后发
  • 财务人员办理会计业务
  • 个税填报后怎么撤销申报
  • 合同负债与预计负责区别
  • 房产税城镇土地使用税减免政策
  • 折扣金额发票
  • 出纳人员应该怎么称呼
  • 增值税普通发票可以抵扣吗
  • 快递费需要计提吗
  • 运输发票上的印章怎么弄
  • 进项结构明细表怎么做
  • 税控服务费抵扣的文件
  • 个人所得税有哪几种
  • 在会计上跨季度增值税专用发票怎么进行红冲?
  • 预付专利转让费计入什么科目?
  • 招待客人买的烟计入业务招待费吗
  • 营改增之前的增值税
  • 以前年度的库存商品出现负数今年如何入账
  • flash动画导出视频有水印吗
  • win10 删除文件 没有找到项目
  • 旅游公司开具的考察费怎么入账
  • 产品成本的计算过程也就是各种费用界限的划分过程
  • 工业增加值计算公式是什么
  • php支付功能
  • 应付票据抵付应付账款
  • wifi增强器1200m的是不是比较好
  • php延迟2秒执行
  • 如何使用rank函数排名
  • 成本结转的科目
  • vue怎么用elementui
  • phprestfulapi框架
  • 布莱顿小镇介绍
  • DOMException: Failed to execute ‘insertBefore‘ on ‘Node‘: The node before which the new node ...报错
  • 嵌入式软件开票税负是1%还是3%
  • 股权转让实操
  • 后浪是什么意思网络用语
  • 企业对外担保代偿能否税前扣除 税务局
  • 公司购买电脑怎么做会计分录
  • 帝国cms移动端
  • event loop exception null
  • 工资的计提基数
  • 增值税普通发票查询真伪
  • 六税两费减半征收政策
  • sql服务如何自动启动
  • 赠送给客户的礼品税法
  • 成本核算的意义与作用
  • 停车费比油费还贵
  • 定期定额户增值税起征点
  • 换下来的旧电池还有用吗
  • 车间检测费会计分录
  • 银行收到客户货款会计分录
  • 计提以前年度应付股利的分录
  • 土地使用权出资是什么意思
  • 收到党建工作经费的通知
  • 刚开业的健身房
  • 公司收到赔偿款要交增值税吗
  • 营业收入包括哪几项收入
  • 如何对会计感兴趣
  • 最新版手机
  • mysql5.7压缩包
  • wrsvn.exe是什么文件
  • centos6.5mini安装教程
  • win7系统分辨率调错了黑屏
  • office解压后如何安装
  • windows10无法关闭
  • linux中vi命令详解
  • 查找linux
  • win8系统怎么打开运行
  • win10个性化颜色在开始任务栏选不了
  • win10mobile最新版本
  • linux rpm包怎么安装
  • Javascript call和apply区别及使用方法
  • python+django
  • bootstrap入门教程
  • 如何搭建应用服务器
  • jquery form validate
  • 网上增值税发票验旧
  • 出口退税的企业货币要回国内吗
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设