位置: 编程技术 - 正文

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

  • 一般纳税人适用会计制度怎么填
  • 企业季度报什么税
  • 长期待摊费用摊销计入什么会计科目
  • 运输企业桥票怎么做会计分录
  • 汽车销售公司购进车辆怎么做账
  • 企业收到外汇的账务处理
  • 附追索权的应收债权出售的会计处理
  • 给政府开发票如何处理?
  • 一般纳税人差额征税怎么做账
  • 印花税购销合同和买卖合同有什么区别
  • 银行利息所得税调整方案
  • 采购均价怎么计算
  • 员工出差补贴怎么入账
  • 差额征税可以开发票吗
  • 遇到境外网络勒索敲诈怎么办
  • 关税保险费计算方法
  • 购买的固定资产进项税可以抵扣吗
  • 社保基数填错了 可以退款吗
  • 年末应计提坏账准备为什么是负数
  • h3c路由配置教程
  • 怎么找回被册的软件
  • 利息如何做会计分录
  • 公司长期贷款
  • 个人所得税住房租金可以扣多少
  • 科技研发公司经营范围包括哪些
  • 苹果电脑屏幕键盘怎么去除
  • rundll.exe是什么程序
  • winds10教育版
  • 手工明细分类账本怎么记
  • SUSE Linux Enterprise Server 11 SP3安装教程详解
  • 强化税收风险意识
  • php递归函数的例子
  • 短期投资需要结转吗
  • 购销合同印花税税率2023
  • php set_time_limit
  • Vue3通透教程【十四】TS复杂类型详解(一)
  • 奥勒松又叫什么
  • php2008
  • iis安装php环境
  • 代收资金清算过期怎么办
  • 票据权利期限可以缩短吗
  • 存货采购成本有余额吗
  • 小微企业认定标准 税务
  • 有净残值的固定资产如何折旧
  • 个税申报赡养老人可以填公婆吗
  • 套期保值和套期图利
  • 一般纳税人收到的普票可以抵扣吗
  • 核定征收的计算方法
  • 购买金税盘的分录怎么做
  • 暂估入库的商品作暂估冲红会计分录
  • 可抵扣的税票
  • 支付保证金如何做账务处理
  • 跨年度利息收入如何调整
  • 预付账款借方如何结转
  • 产品的销售费用计入
  • 购入固定资产一次性税前扣除
  • sql基本教程
  • windows性能监视器横坐标
  • 用友t6运行特别慢
  • 电脑如何进入bios选择u盘启动
  • centos下netconfig 的安装方法
  • sudo service: command not found 报错的解决方法
  • scchost.exe - scchost是什么进程 有什么用
  • win7怎么自启动程序
  • 在Linux系统中安装虚拟window
  • 全面理解全面把握全面落实
  • css中边界margin的多种定义方法
  • js 正则replace
  • android内存使用情况
  • shell中setenv
  • android study
  • SharedPreferences中的MODE_APPEND 和 MODE_PRIVATE 区别
  • 猫猫的娱乐
  • rst.open
  • 中国税务徽标
  • 企业的绿化用地暂免征收土地使用税
  • 深圳税务局实名注册
  • 四季度预缴申报表
  • 税务报道可以学什么专业
  • 北京ca证书下载安装流程
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设