深入理解es6的promise
一、promise入门
1. Promise对象是什么
回调函数的另一种原生实现,比之前回调函数的写法机构清晰,功能强大,
2.以前回调这么写
function a(fn){
let h = 1;
setTimeout(function(){
if(h==1){
fn(h)
}else{
throw Error('error!')
}
},1000)
}
//调用
a(function(m){
console.log(m+'callback')
})
3.用Promise 写回调
function a(){
return new Promise(function(resole,reject){
setTimeout(function(){
if(h==1){
resole(h)
}else{
reject(error)
}
},1000)
})
}
//调用
a().then(function(data){
console.log(data)
},function(err){
console.log(err)
})
4.多层回调实现
//函数封装
function fn(n,callback){
setTimeout(function(){
callback(n)
},1000)
}
function fn2(m,callback){ setTimeout(function(){
callback(m)
},800)
}
function fn3(h,callback){
setTimeout(function(){
callback(h)
},600)
}
//多层回调调用 fn(1, function(n){ console.log('fn='+n);
fn2(2,function(n2){ console.log('fn2='+n2);
fn3(3,function(n3){ console.log('fn3='+n3)
console.log('end')
})
})
});
可见(1)中多层回调写起来很乱,不利于维护,下面用Promise实现
function pm(n){
return new Promise(function(resolve,reject){
setTimeout(function(){
if(n){
resolve(n)
}else{
reject(error)
}
},1000)
})
}
function pm2(n){
return new Promise(function(resolve,reject){
setTimeout(function(){
if(n){
resolve(n)
}else{
reject(error)
}
},1000)
})
}
function pm3(n){
return new Promise(function(resolve,reject){
setTimeout(function(){
if(n){
resolve(n)
}else{
reject(error)
}
},1000)
})
}
//调用
pm(1).then(function(data){
console.log('pm='+data);
return pm2(2)
}).then(function(data){
console.log('pm2='+data);
return pm3(3)
}).then(function(data){
console.log('pm3='+data);
})
用promise调用的写法更加直观
二、Generator
1.Generator函数
(1)异步编程思想来写同步代码
(2)遍历器生成函数
(3)状态机,封装了多个内部状态。
2.形式
function* abc(){
//yield 非必须,return 也非必须;
yield 'a';
yield 'b';
return 'c'
}
//调用
var h = abc();
h.next();//{value:'a',done:false}
h.next();//{value:'b',done:false}
h.next();//{value:'c',done:true}
h.next();//{value:undefined,done:true}
3.把Promise用Generator函数表示
function pm(n){
return new Promise((resolve,reject)=>{
setTimeout(function(){
console.log(n)
resolve()
},1000)
})
}
function pm2(n){
return new Promise((resolve,reject)=>{
setTimeout(function(){
console.log(n)
resolve()
},800)
})
}
function pm3(n){
return new Promise((resolve,reject)=>{
setTimeout(function(){
console.log(n)
resolve()
},600)
})
}
function* gPm(){
yield pm(1);
yield pm2(2);
yield pm3(3);
}
let p = gPm();
p.next().value.then(function(){
p.next().value.then(function(){
p.next().value.then(function(){
})
})
})
在调用的时候用Generator函数;代码更加同步化
三、async/await
1. async/await是什么
(1)异步操作的终极解决方案
2. 写法
function pm(n){
return new Promise((resolve,reject)=>{
setTimeout(function(){
console.log(n)
resolve()
},1000)
})
}
function pm2(n){
return new Promise((resolve,reject)=>{
setTimeout(function(){
console.log(n)
resolve()
},800)
})
}
function pm3(n){
return new Promise((resolve,reject)=>{
setTimeout(function(){
console.log(n)
resolve()
},600)
})
}
async function p(){
await pm(1)
await pm2(2)
await pm3(3)
}
p()
四、总结
不管用then还是用generator 还是用async,都保证你写的function 的返回值是一个**promise**对象
我的博客即将搬运同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=f12524hxoqvv
深入理解es6的promise的更多相关文章
- 深入理解ES6里的promise
一.ES6 Promise是什么? 复杂的概念先不讲,我们先简单粗暴地把Promise用一下,有个直观感受.那么第一个问题来了,Promise是什么呢?是一个类?对象?数组?函数? 别猜了,直接打印出 ...
- 关于ES6的Promise的使用深入理解
ES6的promise对象研究 什么叫promise? Promise对象可以理解为一次执行的异步操作,使用promise对象之后可以使用一种链式调用的方式来组织代码:让代码更加的直观. 那我们为什么 ...
- ES6的promise对象研究
ES6的promise对象研究 什么叫promise? Promise对象可以理解为一次执行的异步操作,使用promise对象之后可以使用一种链式调用的方式来组织代码:让代码更加的直观. 那我们为什么 ...
- 全面理解Javascript中Promise
全面理解Javascript中Promise 最近在学习Promise的时候,在网上收集了一些资料,发现很多的知识点不够系统,所以小编特意为大家整理了一些自认为 比较好的文章,供大家更好地学习js中非 ...
- 浅谈ES6原生Promise
浅谈ES6原生Promise 转载 作者:samchowgo 链接:https://segmentfault.com/a/1190000006708151 ES6标准出炉之前,一个幽灵,回调的幽灵,游 ...
- ES6之Promise用法详解
一 前言 本文主要对ES6的Promise进行一些入门级的介绍.要想学习一个知识点,肯定是从三个方面出发,what.why.how.下面就跟着我一步步学习吧~ 二 什么是Promise 首先是what ...
- ES6新增"Promise"可避免回调地狱
Promise是一个构造函数,自己身上有all.reject.resolve这几个眼熟的方法,原型上有then.catch等同样很眼熟的方法. 那就new一个 var p = new Promise( ...
- 教你如何使用ES6的Promise对象
教你如何使用ES6的Promise对象 Promise对象,ES6新增的一个全新特性,这个是 ES6中非常重要的一个对象 Promise的设计初衷 首先,我们先一起了解一下,为什么要设计出这么一个玩意 ...
- 【读书笔记】【深入理解ES6】#11-Promise与异步编程
异步编程的背景知识 JavaScript 引擎是基于单线程(Single-threaded)实际循环的概念构建的,同一时刻只允许一个代码块在执行. 所以需要跟踪即将运行的代码,那些代码被放在一个任务队 ...
随机推荐
- Mac下用户名、计算机名、个人目录名修改
1.修改mac用户名 [系统偏好设置]->[用户与群组]->点开左下方的小锁->解锁后再用户头像右击,进入到高级选项->进行设置即可 2.修改mac计算机名 [系统偏好设置]- ...
- 编写简易的JS输入框模糊查询匹配(附有源码和demo)
前言:JS输入框模糊匹配插件以前在工作写过一个类似的 所以这次写轻松很多,这次写优化了几个方面: 1. 添加动态加载css文件 不需要引入css css全部在JS动态生成. 2. 不需要额外的标签 只 ...
- 缩点tarjan
给定一个n个点m条边有向图,每个点有一个权值,求一条路径,使路径经过的点权值之和最大.你只需要求出这个权值和.允许多次经过一条边或者一个点,但是,重复经过的点,权值只计算一次. 缩点含义:将一个环缩成 ...
- P1550 [USACO08OCT]打井Watering Hole
题目描述 Farmer John has decided to bring water to his N (1 <= N <= 300) pastures which are conven ...
- jqgrid 对编辑行填写的内容做格式验证
有时,我们需要在基于jqgrid表格编辑行的单元格做规范验证.jqgrid提供有支持,通过设置字段的editrules属性来约束格式. 约束方式: 1.内置的约束参数 (required: true, ...
- jqgrid 获取选中行主键集合
如何获取选中行的主键集合呢? 使用 getGridParam(selarrrow) 方法可获取所有选中行的主键集合. 注意:此处的主键集合是指-设置为主键的列(key: true).再次提醒:一个j ...
- Oracle substr() instr() 用法
转载:oracle中substr() instr() 用法 substr(字符串,截取开始位置,截取长度) = 返回截取的字符串instr(源字符串,目标字符串,起始字符串,匹配字符串) = 返回要截 ...
- 快速在Ubuntu安装PHP网站
快速安装使用的是tasksel,tasksel是Debian / Ubuntu的工具,安装多个相关软件包作为一个协调的“任务”到你的系统.这个lamp-server^跟taskel这个程序有关.下面是 ...
- Docker容器运行GUI程序的配置方法
0.环境说明 Ubuntu 16.04 docker 1.35 1.Docker的“可视化” Docker本身的工作模式是命令行的,因为主要的使用场景可能是做服务器后端方面的比较多. 但有时候我们会有 ...
- 20155308《网络对抗》Exp8 Web基础
20155308<网络对抗>Exp8 Web基础 实践原理与实践说明 本实践的具体要求有: (1).Web前端HTML 能正常安装.启停Apache.理解HTML,理解表单,理解GET与P ...