一、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的更多相关文章

  1. 深入理解ES6里的promise

    一.ES6 Promise是什么? 复杂的概念先不讲,我们先简单粗暴地把Promise用一下,有个直观感受.那么第一个问题来了,Promise是什么呢?是一个类?对象?数组?函数? 别猜了,直接打印出 ...

  2. 关于ES6的Promise的使用深入理解

    ES6的promise对象研究 什么叫promise? Promise对象可以理解为一次执行的异步操作,使用promise对象之后可以使用一种链式调用的方式来组织代码:让代码更加的直观. 那我们为什么 ...

  3. ES6的promise对象研究

    ES6的promise对象研究 什么叫promise? Promise对象可以理解为一次执行的异步操作,使用promise对象之后可以使用一种链式调用的方式来组织代码:让代码更加的直观. 那我们为什么 ...

  4. 全面理解Javascript中Promise

    全面理解Javascript中Promise 最近在学习Promise的时候,在网上收集了一些资料,发现很多的知识点不够系统,所以小编特意为大家整理了一些自认为 比较好的文章,供大家更好地学习js中非 ...

  5. 浅谈ES6原生Promise

    浅谈ES6原生Promise 转载 作者:samchowgo 链接:https://segmentfault.com/a/1190000006708151 ES6标准出炉之前,一个幽灵,回调的幽灵,游 ...

  6. ES6之Promise用法详解

    一 前言 本文主要对ES6的Promise进行一些入门级的介绍.要想学习一个知识点,肯定是从三个方面出发,what.why.how.下面就跟着我一步步学习吧~ 二 什么是Promise 首先是what ...

  7. ES6新增"Promise"可避免回调地狱

    Promise是一个构造函数,自己身上有all.reject.resolve这几个眼熟的方法,原型上有then.catch等同样很眼熟的方法. 那就new一个 var p = new Promise( ...

  8. 教你如何使用ES6的Promise对象

    教你如何使用ES6的Promise对象 Promise对象,ES6新增的一个全新特性,这个是 ES6中非常重要的一个对象 Promise的设计初衷 首先,我们先一起了解一下,为什么要设计出这么一个玩意 ...

  9. 【读书笔记】【深入理解ES6】#11-Promise与异步编程

    异步编程的背景知识 JavaScript 引擎是基于单线程(Single-threaded)实际循环的概念构建的,同一时刻只允许一个代码块在执行. 所以需要跟踪即将运行的代码,那些代码被放在一个任务队 ...

随机推荐

  1. UPF Usage

    在 multi-voltage design 中,当涉及到多个power supply 时,需要 upf 文件来描述power细节,现将 upf 中的基本概念和使用方法记录如下: upf 中的基本概念 ...

  2. JAVA 框架 springmvc controller的返回值

    一.返回值:ModleView对象. 使用modelAndView.setViewName设置返回的页面.使用modelAndView.addObject设置返回的数据. @RequestMappin ...

  3. java.lang.RuntimeException: Fail to connect to camera service

    玩自定义照相机的时候出现了:java.lang.RuntimeException: Fail to connect to camera service 讲过百度和Google后知道是权限少加了.(试验 ...

  4. tarjan - 强连通

    如果两个点可以互相到达,则称为强连通.如果有向图G每个点都可以互相到达,则称为强连通图.其中G中的极大强连通子图,则称为强连通分量.现求强连通分量是多少,且哪些点属于同一个强连通分量 tarjan由d ...

  5. 开启路由转发 - route add -net 0.0.0.0 netmask 0.0.0.0 gateway 192.168.0.131 window tracert 追踪路由

    1.登录方式内网访问172.28.101.0/19网段的方法:在192.168.1.0/24网段的上网机器上,或在自己的操作机上加个192.168.1.0网段的ip,注意不要跟别人设置的冲突了,并添加 ...

  6. C#抽象类与抽象方法--就是类里面定义了函数而函数里面什么都没有做的类

    看一下代码应该就可以了 using System; using System.Collections.Generic; using System.Linq; using System.Text; na ...

  7. canvas绘画基础(一):认识canvas画布

    html5提供了一个<canvas>标签,结合javascript的canvas api接口可以用来绘制图形和动画.最近工作中涉及到画图的任务,下面来了解一下canvas的基础:canva ...

  8. jq 在字符串中,去掉指定的元素

    例: var arr= ["4.5岁", "3.5岁", "5.5岁", "5岁", "4岁"] v ...

  9. Kubernetes学习之路(十九)之Kubernetes dashboard认证访问

    Dashboard:https://github.com/kubernetes/dashboard 一.Dashboard部署 由于需要用到k8s.gcr.io/kubernetes-dashboar ...

  10. Flask学习-Flask基础之WSGI

    一.WSGI为什么会出现? 在学习一个东西之前,我们肯定想知道:它为什么会出现?那么,WSGI为什么会出现呢? 我们知道,部署一个web应用,经常需要使用nginx.apache或者IIS等web服务 ...