[TOC]
>[success] # ES6 Promise解决异步代码
~~~
'Promise'是一个'构造函数',他有一个参数,参数的类型为'Function'类型,这个function有2个参数,
一个是'resolve表示成功'的返回值,另一个是'reject表示失败'的回调函数。
~~~
<br/>
>[success] ## 基础用法
封装时候这么写:
~~~
变量写法:
let promise = new Promise((resolve, reject) =>{
api(parameter).then(res => {
// 成功就把res返回出去
resolve(res)
}).catch(e =>{
// 失败就返回错误,可以直接这样写,new Error(' 报错了 ')
reject(new Error(e))
})
})
函数写法:
function promise (){
return new Promise((resolve, reject) =>{
api(parameter).then(res => {
// 成功就把res返回出去
resolve(res)
}).catch(e =>{
// 失败就返回错误,可以直接这样写,new Error(' 报错了 ')
reject(new Error(e))
})
})
}
~~~
调用时候这么写:
~~~
// 变量写法这样调用
promise.then(res =>{
// 这里写成功时候要执行的代码
}).catch(e =>{
这里写失败时候要执行的代码
})
// 函数写法这样调用
promise().then(res =>{
// 这里写成功时候要执行的代码
}).catch(e =>{
这里写失败时候要执行的代码
})
~~~
<br/>
>[success] ## 用Promise解决异步问题
~~~
下面的代码就是一个经典的'异步'问题,我们期望的是先打印出'呵呵哒',后打印'嘎嘎',实际上相反。
~~~
~~~
setTimeout(() => {
console.log('呵呵哒')
},500)
setTimeout(() => {
console.log('嘎嘎')
},300)
打印结果:
// '嘎嘎'
// '呵呵哒'
~~~
<br/>
>[success] ### 用.then的链式写法解决异步问题
~~~
首先封装2个'Promise'方法,'Fun1'和'Fun2'
~~~
~~~
function Fun1(){
return new Promise((resolve, reject) => {
setTimeout(function(){
console.log('呵呵哒')
resolve(1)
},500)
})
}
function Fun2(){
return new Promise((resolve, reject) => {
setTimeout( function(){
console.log('嘎嘎')
resolve(2)
},300)
})
}
~~~
调用时这样写:
~~~
function Fun3(){
Fun1().then(res => {
return Fun2()
}).then(res => {
// 执行要执行的代码
}).catch(e => {
// 只要Fn1报错了就错误就会直接抛到这里
})
}
Fun3()
打印结果:
// 呵呵哒
// 嘎嘎
~~~
<br/>
>[success] ### 用ES7 async 和 await来解决异步
es7的写法很简洁,很方便。
~~~
async function Fun3(){
try{
let res = await Fun1()
let res2 = await Fun2()
} catch (e) {
// 只要Fn1报错了就错误就会直接抛到这里
}
}
~~~
- Javascript基础篇
- Array数组
- 数组插入值
- filter()
- forEach()
- push()
- pop()
- unshift()
- shift()
- valueOf()
- 面向对象思想
- Javascript 面向对象编程(一):封装
- Javascript面向对象编程(二):构造函数的继承
- Javascript面向对象编程(三):非构造函数的继承
- 解构
- 数组的解构赋值
- 对象的解构赋值
- 函数参数解构
- 字符串的解构赋值
- 数值和布尔值的解构赋值
- 圆括号问题
- 字符串.
- split()
- charAt()
- charCodeAt()
- concat()
- indexOf()
- lastIndexOf()
- match()
- replace()
- includes()
- 初识递归
- 渲染ul-li树形结构
- 异步函数解决方案
- 1. callback回调函数
- 2. ES6 - Promise
- JavaScript高级程序设计(书)
- 在html中使用JavaScript
- script标签的位置
- 延迟脚本
- 异步脚本
- <noscript>元素
- 基本概念
- 严格模式
- 变量详解
- 数据类型
- typeof操作符
- undefined类型
- Null类型
- Boolean类型
- Number类型
- 深入了解ES6(书)
- var 、let 、 const
- 字符串与正则表达式
- 字符串
- 正则表达式
- 函数
- 函数形参默认值
- 使用不具名参数
- 函数构造器的增强能力
- 扩展运算符
- name属性
- 明确函数的多重用途
- 块级函数
- 箭头函数
- 尾调用优化
- 扩展的对象功能
- 对象类别
- 对象字面量语法的扩展
- ES6对象新增方法
- 重复的对象属性
- 自有属性的枚举顺序
- 更强大的原型
- 解构:更方便的数据访问
- 为什么要用解构?
- 对象解构
- 数组解构
- 混合解构
- 参数解构
- Symbol与Symbol属性
- 创建Symbol
- Symbol的使用方法
- Symbol全局私有属性
- Symbol与类型强制转换
- Symbol属性检索
- Symbol的一些构造方法
- Set集合与Map集合
- Set集合
- Weak Set集合(弱引用Set集合)
- Map集合
- JS标准内置对象
- Object 构造函数及属性
- Object 构造方法
- Symbol 内建对象类的函数及属性
- Set 构造函数及属性
- Weak Set 构造函数及属性
- JS杂项
- 类数组对象
- Class类的理解和使用