前端项目中常用es6知识总结 -- Promise逃脱回调地狱
项目开发中一些常用的es6知识,主要是为以后分享小程序开发、node+koa项目开发以及vueSSR(vue服务端渲染)做个前置铺垫。
项目开发常用es6介绍
1、块级作用域 let const
2、箭头函数及this指向
3、promise、
- 4、async await语法
4、模块化 module export和import
5、解构赋值、字符串模板
……
Promise
Promise是什么?不妨直接打印出来看吧! 在浏览器控制台输入console.dir( Promise )回车会有惊喜。
// 大家在浏览器控制台输入console.dir( Promise )看一下哈!!!
可以看到Promise是一个构造函数,它跟JS中的Date、Array等构造函数类似,使用new操作符实例化之后就可以通过传参和调用方法的形式来完成某些特定的功能:
var date = new Date("2018-12-24 15:46:10");
date.getTime() //
date.getFullYear() //
date.getDate() //
同样,我们也需要使用new操作符来实例化Promise构造函数,与其他构造函数不同的是Promise接收一个函数作为参数。该函数又接收两个参数,分别是resolve和reject,resolve和reject也是函数(javascript内置的)且这两个函数都有各自不同的作用。 resolve函数的作用是:将Promise对象的状态从未完成变为成功(即从 pending 变为 resolved) reject函数的作用是:将Promise对象的状态从未完成变为失败(即从 pending 变为 rejected) 无论结果是成功还是失败,都可以将需要传递的参数通过该函数传递出去,以下是代码示例:
var promise = new Promise(function(resolve, reject) {
setTimeout(function() {
resolve("我是数据")
}, 1000)
}) var failExample = new Promise(function(resolve, reject) {
setTimeout(function() {
reject(new Error('我错了'))
}, 1000)
})
then方法
Promise 实例具有then方法,then方法的第一个参数是resolve(成功)的回调,第二个参数(可选)是reject(失败)的回调。
var promise = new Promise(function(resolve, reject) {
setTimeout(function() {
if (false) {
resolve("我是数据")
} else {
reject(new Error('我错了'))
}
}, 1000)
}) promise.then(function(data) {
console.log(data) // 我是数据 当if条件为真时触发
}, function(err) {
console.log(err) // Error: 我错了 当if条件为假时触发
})
使用箭头函数的话,代码会更简洁:
var promise = new Promise((resolve, reject) => {
setTimeout(() => {
false ? resolve("我是数据") : reject(new Error('我错了'))
}, 1000)
}) promise.then(
(data) => console.log(data),
(err) => console.log(err)
)
catch方法
catch方法和then的第二个参数一样,用来指定reject时的回调,用法是这样:
var promise = new Promise((resolve, reject) => {
setTimeout(() => {
false ? resolve("我是数据") : reject(new Error('我错了'))
}, 1000)
})
promise
.then(
(data) => console.log(data)
)
.catch(
(err) => console.log(err)
)
all方法
Promise.all方法用于将多个 Promise 实例,包装成一个新的 Promise 实例。此方法提供了并行执行异步操作的能力,并且在所有异步操作执行完后才执行回调。举一个例子:开发中首页可能会有多个接口,如果写多个方法同时请求数据,很可能最终页面展示的时候会一块接一块显示出来就像是拼接完成的。通过Promise.all我们就可以将多个方法请求的数据同时展现出来:
var getData1 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve("1、接口1的数据")
}, 700)
}) var getData2 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve("2、接口2的数据")
}, 100)
}) var getData3 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve("3、接口3的数据")
}, 300)
}) Promise.all(
[getData1, getData2, getData3]
).then((data) => {
console.log(data) // ["1、接口1的数据", "2、接口2的数据", "3、接口3的数据"]
})
上述代码可以看出all接收一个数组作为参数,数组成员分别是定义好的Promise实例,当所有的接口都成功时将按顺序把返回的结果放到一个数组里传给then方法。
race方法
Promise.race方法同样是将多个 Promise 实例,包装成一个新的 Promise 实例。使用race方法时如果有一个率先成功,那么就立即返回。由此可见all和race的区别是: all方法的效果实际上是 “谁跑的慢,以谁为准执行回调”, race方法的效果实际上是 ”谁跑的快,以谁为准执行回调”
var getData1 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve("1、接口1的数据")
}, 700)
}) var getData2 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve("2、接口2的数据")
}, 1000)
}) var getData3 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve("3、接口3的数据")
}, 300)
})
Promise
.race(
[getData1, getData2, getData3]
)
.then((data) => {
console.log(data)// 3、接口3的数据
})
Promise的出现主要是解决地狱回调的问题,比如有一个功能需要请求很多个接口,且每一个接口的参数都需要另外一个的接口返回的数据作为依赖,这样就需要我们一层嵌套一层,但是有了Promise 我们就无需嵌套,就可以使用then方法链式调用。
前端项目中常用es6知识总结 -- Promise逃脱回调地狱的更多相关文章
- 前端项目中常用es6知识总结 -- let、const及数据类型延伸
项目开发中一些常用的es6知识,主要是为以后分享小程序开发.node+koa项目开发以及vueSSR(vue服务端渲染)做个前置铺垫. 项目开发常用es6介绍 1.块级作用域 let const 2 ...
- 前端项目中常用es6知识总结 -- 箭头函数及this指向、尾调用优化
项目开发中一些常用的es6知识,主要是为以后分享小程序开发.node+koa项目开发以及vueSSR(vue服务端渲染)做个前置铺垫. 项目开发常用es6介绍 1.块级作用域 let const 2. ...
- 前端项目中常用es6知识总结 -- Async、Await让异步美如画
项目开发中一些常用的es6知识,主要是为以后分享小程序开发.node+koa项目开发以及vueSSR(vue服务端渲染)做个前置铺垫. 项目开发常用es6介绍 1.块级作用域 let const 2. ...
- ES6系列之项目中常用的新特性
ES6系列之项目中常用的新特性 ES6常用特性 平时项目开发中灵活运用ES6+语法可以让开发者减少很多开发时间,提高工作效率.ES6版本提供了很多新的特性,接下来我列举项目中常用的ES6+的特性: l ...
- 在Vue&Element前端项目中,对于字典列表的显示处理
在很多项目开发中,我们为了使用方便,一般都会封装一些自定义组件来简化界面的显示处理,例如参照字典的下拉列表显示,是我们项目中经常用到的功能之一,本篇随笔介绍在Vue&Element前端项目中如 ...
- Android 项目中常用到的第三方组件
项目中常用到的第三方组件 1 社会化分享ShareSDK-Core-2.5.9.jarShareSDK-QQ-2.5.9.jarShareSDK-QZone-2.5.9.jarShareSDK-Sin ...
- 项目中常用js方法整理common.js
抽空把项目中常用js方法整理成了common.js,都是网上搜集而来的,大家一起分享吧. var h = {}; h.get = function (url, data, ok, error) { $ ...
- 记录下项目中常用到的JavaScript/JQuery代码二(大量实例)
记录下项目中常用到的JavaScript/JQuery代码一(大量实例) 1.input输入框监听变化 <input type="text" style="widt ...
- 项目中常用的MySQL 优化
本文我们来谈谈项目中常用的MySQL优化方法,共19条,具体如下: 一.EXPLAIN 做MySQL优化,我们要善用EXPLAIN查看SQL执行计划. 下面来个简单的示例,标注(1.2.3.4.5)我 ...
随机推荐
- vue23:vue-loader
vue-loader: 其他loader -> css-loader.url-loader.html-loader..... 后台: nodeJs(模块化) -> require expo ...
- FSM之三--代码风格
FSM设计之一http://www.cnblogs.com/qiweiwang/archive/2010/11/28/1890244.html Moore型状态机与mealy型状态机相比,由于其状态输 ...
- Linux 内核源码(kernel source)
查看内核的发行版:uname -r(--kernel-release) $ uname -r 4.4.0-78-generic 内核源码所在的位置:/usr/src $ cd /usr/src $ l ...
- Gallery滑动一页(一个Item)效果
本文主要介绍如何使用Gallery只滑动一页以及其实现原理. Demo APK 可以方便的查看效果,在各大应用商店搜索 trinea android 下载即可,如:Google Play. 可运行代码 ...
- 机器学习(三) Jupyter Notebook, numpy和matplotlib的详细使用 (下)
七.Numpy中的矩阵运算 八.Numpy中的聚合运算 九.Numpy中的arg运算 十.Numpy中的比较和Fancy Indexing 十一.Matplotlib数据可视化基础 十二.数据加载和简 ...
- 定时器函数SetTimer
原文链接:http://www.cnblogs.com/zhangpengshou/archive/2009/04/05/1429770.html 一.SetTimer表示的是定义个定时器.根据定义指 ...
- jquery常规选择器再学习_1123
jquery选择器基本模拟css语法来获取元素: 1 常规选择器 id 常见的元素标签 class 2 进阶选择器 组合选择器 常规选择器多个组合在一起 通配符选择器 * ,通常用于局部环境下 后代选 ...
- 最近遇到的若干Web前端问题:disable和readonly,JqueryEasyUI,KindEditor
最近项目中用到了Jquery Easyui和KindEditor等框架组件,问题真不少啊~ 一些看起来很简单理所当然的事情,竟然花费了不少时间,才解决好~ 1.readonly和disable的区 ...
- 本地运行github上的vue2.0仿饿了么webapp项目
在vue刚刚开始流行的时候,大多数人学习大概都见到过这样的一个项目吧,可以作为学习此框架的一个模板了 github源码地址:https://github.com/RegToss/Vue-SPA 课程教 ...
- 【HDOJ 5384】Danganronpa
[HDOJ 5384]Danganronpa AC自己主动机. .. 当时感觉用字典树 标神也往自己主动机想来着..手太生加上时间紧迫也没敲--回来一看题解什么AB同一时候建自己主动机...顿时愣了 ...