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+规范,理解 ...
随机推荐
- Docker端口映射
Docker端口映射是指将容器内应用的服务端口映射到本机宿主机器.当要在宿主机外部访问Docker内部应用时,需要对容器内应用端口进行映射. 一.容器启动时指定端口映射 容器运行时可以通过-p 或 - ...
- CentOS7更改运行级别
Step 1:查看系统默认运行级别 [root@node-1 html]# systemctl get-default //图形界面graphical.target [root@node- ...
- Food Delivery ZOJ - 3469(区间dp)
题目传送门 题目翻译:当我们专注于解决问题时,我们通常宁愿呆在电脑前而不是外出吃午饭.在这个时候,我们可能会要求提供食物. 假设有N个人生活在一条直线的街道上,它只是位于X坐标轴上.第i个人的坐标是X ...
- Openssl asn1parse命令
一.简介 asn1parse命令是一种用来诊断ASN.1结构的工具,也能用于从ASN1.1数据中提取数据 二.语法 openssl asn1parse [-inform PEM|DER] [-in f ...
- 自定义圆形ImageView(解决Bitmap bitmap = ((BitmapDrawable) drawable).getBitmap();报错问题)
package com.bottle.bottlelilibrary.view; import android.content.Context; import android.graphics.Bit ...
- 20175325 《JAVA程序设计》实验二《JAVA开发环境的熟悉》实验报告
20175325 <JAVA程序设计>实验二<JAVA开发环境的熟悉>实验报告 一.实验报告封面 课程:Java程序设计 班级:1753班 姓名:石淦铭 学号:20175325 ...
- mercury水星路由wifi连接不上的坑
如题,房东发给我的水星路由,是有些bug的,比方说我的手机会偶尔某天连上了没有网络,但是其他wifi设备和有线就没问题. 这种wifi网络很差甚至没有网络的问题会随机在你的wifi设备上发生,你甚至连 ...
- PPS--在download DN出现的问题注意:
1,DN的下载条件:(没有删除没有下载) PPSL=’N’(PPSL有两个值,N时是指这个DN还没有下载) DEL_FLAG<>’Y’(DEL_FLAG有两个值,Y时说明已经删除,不会下载 ...
- 获取当前最顶层的VC
#pragma mark - 获取当前最顶层的ViewController - (UIViewController*)topVC:(UIViewController*)VC { if([VC isK ...
- java33
1.面向接口编程:将实现类对象(键盘鼠标)赋值给接口类型的变量(USB) interface修饰的类名称 好处:调用时可以是一个方法体即可(实现通用编程) 2.内部类:在类中定义了一个类 ------ ...