Promise实践
一、概念
Promise是异步编程的解决方案之一,与事件驱动+回调函数并列。
Promise是专门为异步编程设计的封闭的一次性用品,封闭体现在只有异步操作的结果能改变其状态,其他任何操作都不能改变其状态。一次性体现在一旦新建就会运行而且一旦状态改变,就不会再改变。
注意1:调用resolve或reject并不会中止Promise内代码的执行,不管是同步还是异步代码,就算是ajax这种异步操作,将这些异步操作添加到事件循环的末尾的动作也是同步的。但是理论上来说,resolve和reject调用之后Promise的状态一定会改变,根据它一次性的特点,它已经没有意义了,后面不应该有代码,可以在resolve和reject前加上return,这样它们后面的代码就不会执行了。
注意2:Promise会吃掉错误,Promise内部发生的语法错误不影响外部代码的执行。这也体现出Promise是真的封闭
二、语法
const promise = new Promise(function(resolve,reject){
// asynchronous code
if(/*success*/){
resolve(value);
}else{
reject(error);
}
});
进阶用法1:resolve或reject的参数是一个promise,这个参数的promise将决定外部promise的状态
const p1 = new Promise(function (resolve, reject) {
setTimeout(() => reject(new Error('fail')), 3000)
})
const p2 = new Promise(function (resolve, reject) {
setTimeout(() => resolve(p1), 1000)
})
p2
.then(result => console.log(result))
.catch(error => console.log(error))
//Error:fail
进阶用法2:then和catch可以链式调用,返回一个新的Promise实例,如果在then中不显式返回一个promise实例,then会将你return的data(字符串啊什么的)当做默认promise对象的resolve的参数,并执行resolve(data)
进阶用法3:catch(error)是then(null,function(error))的别名,除了处理rejected状态,还可以捕获Promise中抛出的错误。
经测试,then中的reject处理函数也能捕获promise中抛出的错误,可以说,reject函数的作用等同于抛出错误。
错误具有冒泡性质,总会被后面的catch捕获。推荐使用catch代替then的第二个参数。
三、实例:https://github.com/WHITE-ILMARE/Front-End-Learning-Demos/tree/master/ES6/promise
1.控制最基础的异步——setTimeout();
2.对单个Ajax请求的控制
3.Promise.all:各个子Promise的结果会存储在数组中作为外部Promise实例resolved的参数。
若子Promise有catch方法,就调用自己的catch,若没有,就调用外部Promise实例的catch方法。就语义上来说,这样做阻止了子Promise的一次reject导致多次catch,比较有意义。可以根据需要,决定统一处理rejected还是定制化处理rejected。
四、理解
写了几个Promise实例,Promise的优点在哪?
1.形式上,想一下jquery中的$.get(url,callback(data)),如果用promise,可以写成new Promise(function(...){$.get(url,resolve(data))}).then(data),就是把传统的回调函数掏出来写在外边了,听说这是同步的写法,我还不明白什么叫同步的写法,没有回调就是同步的写法??总而言之,就是形式上的简化。
2.理解方式上,我在读了ES6 JavaScript Promise的感性认知« 张鑫旭-鑫空间-鑫生活 - zhangxinxu这篇文章后想到,将回调函数的写法转换成promise.then().then()这种写法易于让人读懂代码,更容易理解代码。因为这种写法代表一种逻辑,应该就是上一条说的同步的逻辑,更符合现实世界人们的思维方式,所以便于理解,提高了代码可读性和结构。
Promise实践的更多相关文章
- jquery的promise实践--连续加载图片
在javascript设计模式实践之代理模式--图片预加载中用代理模式实现了图片预加载功能. 现在就更进一步,完成一个能够一张一张的连续图片加载的功能. 功能: 1.一张一张加载图片. 2.加载错误, ...
- 一次Promise 实践:异步任务的分组调度
起因是在工作中遇到一个问题,可以用一个二维数组简单描述: [[1,2,3],[4,5,6],[7,8,9]] 这里每个数字都代表“一个异步计算任务”, 每个子数组把1个或多个计算任务划分成组,要求是: ...
- javascript中的promise和deferred:实践(二)
javascript中的promise和deferred:实践(二) 介绍: 在第一节呢,我花了大量的时间来介绍promises和deferreds的理论.现在呢,我们来看看jquery中的promi ...
- javascript设计模式实践之模板方法--具有百叶窗切换图片效果的JQuery插件(二)
在上一篇<javascript设计模式实践之迭代器--具有百叶窗切换图片效果的JQuery插件(一)>里,通过采用迭代器模式完成了各初始化函数的定义和调用. 接下来就要完成各个切换效果的编 ...
- vue实践---vue结合 promise 封装原生ajax
有时候不想使用axios这样的外部依赖,想自己封装ajax,这里有两种方法 方法一,在单个页面内使用 封装的代码如下: beforeCreate () { this.$http = (() => ...
- ES6之Promise学习与实践
1.前言 在平时的业务开发中,前端通常需要请求后台获取数据,或者NodeJs读取文件等等一系列的异步操作,我们通常需要利用异步操作的结果或者对异步操作的结果进行处理.通常我们的解决方案是:在异步操作成 ...
- Promise最佳实践(转)
本文作者:IMWeb dekuchen 原文出处:IMWeb社区 未经同意,禁止转载 有关Promise的几个问题 基础概念 一:什么是Promise 国内比较流行的看法: 阮一峰: Promise ...
- Promise里捕捉错误的最佳实践
Promise里的同步部分不需要try catch new Promise((resolve, reject) => { throw new Error('error'); setTimeout ...
- 大白话讲解Promise(二)理解Promise规范
上一篇我们讲解了ES6中Promise的用法,但是知道了用法还远远不够,作为一名专业的前端工程师,还必须通晓原理.所以,为了补全我们关于Promise的知识树,有必要理解Promise/A+规范,理解 ...
随机推荐
- 为sqlserver数据库添加专用用户名
在安全里面右键添加登录名,输入登录名与密码(可以取消强制密码策略)然后选择用户映射的数据库,勾选db_owner即可.
- C#给checkboxList设置js选中事件
C#: for (int i = 0; i < this.CheckBoxList1.Items.Count; i++) { this.CheckBoxL ...
- poj_3045 贪心
Farmer John's N (1 <= N <= 50,000) cows (numbered 1..N) are planning to run away and join the ...
- 国内安装helm
helm repo remove stable helm repo add stable https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts ...
- Distance on the tree
Distance on the tree https://nanti.jisuanke.com/t/38229 DSM(Data Structure Master) once learned abou ...
- checkpoint防火墙SmartDashboard登录出错
SmartDashboard登录是报错:fingerprint不匹配 原因:主备机切换导致 解决:选择凌晨不影响业务的时间拔掉原备机的电源线.
- ABAP开发相关事务代码
事务代码 事务描述 事务代码 事务描述 SE37 ABAP/4函数编辑器 BAPI BAPI 浏览器 SE38 ABAP编辑器 LSMW 数据导入工具 SE39 ABAP分屏编辑器 PFCG 权限管理 ...
- Linux(centos)下安装JDK
安装 JDK是运行java程序必不可少的环境,服务器上跑程序也不例外.首先在安装之前,要知道Linux下安装软件有两种,一种是使用yum等命令直接下载,一种是使用上传下载工具,上传至Linux下使用, ...
- database锁实现
单独创建一张表存放获取锁所需的key和value,key值保持唯一,value从0开始按1递增,在代码中用私有成员变量ConcurrentHashMap存储每个key value值,初始化时每个线程的 ...
- 如何打开用eclipse没有.project文件的Java工程
大概分为以下7个步骤,具体如下: 1.在你的eclipse下新建一个与你想要打开的源代码项目同名的一个项目(我这举例叫myweb). 2.在电脑磁盘中找到刚刚新建的项目,把它生成的.project文件 ...