位置: 编程技术 - 正文

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

  • 小规模企业需要申报吗
  • 企业成立多久能注销
  • 法定免税项目包括
  • 税后经营净利润加折旧与摊销
  • 进料加工出口退税政策
  • 生产企业退税计算方法怎么选择
  • 未开具发票负数的原因
  • 税务局不给注销税务
  • 电子发票红字发票怎么开
  • 固定资产的折旧方法一经选定,不得随意变更
  • 固定资产拆除后账务处理
  • 以前漏记的成本怎么处理
  • 企业大股东减持股份
  • 一般纳税人在外地预缴税款
  • 营改增后加工行业的税率是多少?
  • 茶叶加食用盐的妙用
  • 无产权车位20年到期后还收费吗
  • 银行对账单是否属于会计档案
  • 汇票贴息会计分录
  • 调整期初数怎么做会计分录
  • 企业接受非现金资产投资的账务处理
  • 金税盘开红字发票
  • 出口退税企业的税负率怎么算?
  • 网上抵扣发票操作
  • 收据是否当月入帐
  • 关联企业借款利息税前扣除
  • 自然人独资属于什么经济性质
  • 预收房租费用计入什么科目
  • 苹果电脑隐藏软件功能怎么开启
  • 酒店采购布草如何入账
  • Win10任务栏没有wifi图标
  • wordpress文章主题
  • 企业如何转让
  • 位于Praprotno村之上的圣托马斯教堂 (© Guy Edwardes/Minden Pictures)
  • 图像融合名词解释
  • lvm部署的命令
  • 转出多交增值税账务处理
  • 长投转可供
  • 普通发票退税流程图
  • 跨境电商小规模运营负责那些工作
  • 2、springboot+mybatis+ajax+pageHelper+idea+maven(全套增删改查)
  • 漏税处罚
  • 中国源码亲测网
  • 银行询证函快递费计入什么科目
  • 个体户开发票超过定额是如何交税?
  • 在建工程核算的内容有哪些
  • 经营许可证需要多久时间
  • 个人购销合同范本
  • 租赁中承租人的会计分录
  • 拿工资要开发票,发票去哪儿开?
  • 培训学校的主营业务是什么
  • 贴现利息收入的账务处理
  • 待认证进项税额是二级科目还是三级科目
  • 公允价值的通俗理解
  • 转账支票一定要填写支付密码吗?
  • 采购库存商品的分录
  • 数据库表的查询学会了什么
  • mysql 索引 语句
  • sqlserver远程连接设置
  • windows7如何设置电脑休眠时间
  • centos占用内存高
  • windowsxp停止服务的时间
  • mac使用磁盘工具的快捷键
  • root忘记密码了怎么办
  • win8开不了机怎么系统还原
  • linuxvim编辑器的用法
  • cocos2dx schedule
  • nodejs抓取网页内容
  • 安卓查看安装包
  • 开手游游戏
  • vue组件的使用步骤
  • ubuntu on android
  • 用javascript
  • unity如何成一组
  • 手机糖果游戏娱乐
  • javascript代码用什么来标记
  • jquery代码实例
  • js函数详解
  • 捐赠收入如何交印花税
  • 开票软件里的统计怎么弄
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设