ES6 Promise使用介绍
1、什么是Promise
Promise 是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大。
这么说可能不够直观的理解,看下面的两个例子
// callback回调函数
function getCallback(n,callback) {
setTimeout(() => {
var num = 2*n
console.log('num',num)
callback(num) },2000)
}
getCallback(3,function callback(n) {
console.log('n',n)
}) // Promise函数的基础用法(等同于上面的回调函数)
function runPro(n){
let p = new Promise((resolve,reject) => {
setTimeout(() => {
var num = 2*n
console.log('num',num)
resolve(num)
},2000)
})
return p
}
runPro(3).then((res) => {
console.log('res',res)
})
这么看是不是觉得Promise并没有什么特别的,而且还要费劲封装,有这功夫用回调函数就好了,那么在看下面的例子
// 三层callback回调函数(传说的回调地狱)
function getCallback0(n,callback1) {
setTimeout(() => {
var num0 = 2*n
console.log('num0',num0)
callback1(num0,function callback2(params,callback3) {
let num2 = params + 1
console.log('num2',num2)
callback3(num2)
})
},2000)
} getCallback0(3,function callback1(n,callback2) {
let num1 = n+1
console.log('num1',num1)
callback2(num1,function callback3(params) {
let num3 = params + 1
console.log('num3',num3)
}
)
}) // 三层Promise(等同于上面的回调函数)
function runPro0(n){
let p = new Promise((resolve,reject) => {
setTimeout(() => {
var num0 = n*2
console.log('num0',num0)
resolve(num0)
},2000)
})
return p
}
runPro0(3)
.then((res) => {
// console.log('res',res)
let Pro1 = new Promise((resolve,reject) =>{
var num1 = res+1
console.log('num1',num1)
resolve(num1)
})
return Pro1
})
.then((res) =>{
// console.log('res',res)
let Pro2 = new Promise((resolve,reject) =>{
var num2 = res+1
console.log('num2',num2)
resolve(num2)
})
return Pro2 })
.then((res) =>{
var num3 = res+1
console.log('num3',num3)
// 如果需要可以继续回调
})
通过上面的对比可以很清除的看出,用Promise处理异步事件更加简洁直观
2、基础用法
const p = new Promise(function(resolve,reject){
if(success){
resolve('成功的结果')
}else{
reject('失败的结果')
}
})
p.then(function (res) {
// 接收resolve传来的数据,做些什么
},function (err) {
// 接收reject传来的数据,做些什么
})
p.catch(function (err) {
// 接收reject传来的数据或者捕捉到then()中的运行报错时,做些什么
})
p.finally(function(){
// 不管什么状态都执行
})
3、Promise的相关方法
Promise.prototype.then()
Promise.prototype.catch()
Promise.prototype.finally()
Promise.resolve()
Promise.reject()
Promise.all()
Promise.race()
由代码可以看出.then() .catch() .finally()都是定义在原型对象上的
4、then 的用法
由上面的基础用法代码可以看出.then()接收两个参数,第一个是resolved状态的回调函数,第二个是rejected状态的回调函数
function getNumber1(){
var p = new Promise(function(resolve, reject){
setTimeout(function(){
console.log('1')
resolve('随便什么数据1');
}, 1000);
});
return p;
}
function getNumber2(){
var p = new Promise(function(resolve, reject){
setTimeout(function(){
console.log('2')
reject('随便什么数据2');
}, 2000);
});
return p;
}
function getNumber3(){
var p = new Promise(function(resolve, reject){
setTimeout(function(){
console.log('3')
reject('随便什么数据3');
}, 3000);
});
return p;
}
Promise.all([getNumber1(),getNumber2(),getNumber3()])
.then(function(res){
console.log('res',res)
console.log('res',res[2].data)
},function (err){
console.log('err',err)
})
.catch(function(err2){
console.log('err2',err2)
})
注意:
1、Promise定义后就执行,所以通常用函数进行分装
2、Promise.all()中的参数是以一个数组传入的
ES6 Promise使用介绍的更多相关文章
- es6 Promise简单介绍
promise的基本用法 promise执行多步操作非常好用,那我们就来模仿一个多步操作的过程,那就以吃饭为例吧.要想在家吃顿饭,是要经过三个步骤的. 洗菜做饭. 坐下来吃饭. 收拾桌子洗碗. 这个过 ...
- 解析ES6 Promise
ES6 Promise 概念之类的,大概读者都应该有所知道,接下来我们直入终点. 先让我们来看看什么是Promise吧,他是一个object,类,arry,function? 首先,学习它的时候应该讲 ...
- 通过 ES6 Promise 和 jQuery Deferred 的异同学习 Promise
Deferred 和 Promise ES6 和 jQuery 都有 Deffered 和 Promise,但是略有不同.不过它们的作用可以简单的用两句话来描述 Deffered 触发 resolve ...
- ES6 Promise 接口
构造函数 new Promise(function(resolve, reject){}); 构造函数接受一个函数(executor)作为参数,该函数在返回 Promise 实例之前被调用.函数的两个 ...
- Es6 Promise 用法详解
Promise是什么?? 打印出来看看 console.dir(Promise) 这么一看就明白了,Promise是一个构造函数,自己身上有all.reject.resolve这几个眼熟的方 ...
- ES6 Promise 全面总结
转载:点击查看原文 ES6 Promise对象 ES6中,新增了Promise对象,它主要用于处理异步回调代码,让代码不至于陷入回调嵌套的死路中. @-v-@ 1. Promise本质 Promise ...
- ES6 Promise 异步操作
最近越来越喜欢与大家进行资源分享了,并且及时的同步到自己的园子内,为什么呢? 一.小插曲(气氛搞起) 在上个月末,由于领导的高度重视(haha,这个高度是有多高呢,185就好了),走进了公司骨干员工的 ...
- 微信小程序Http高级封装 es6 promise
公司突然要开放微信小程序,持续蒙蔽的我还不知道小程序是个什么玩意. 于是上网查了一下,就开始着手开发..... 首先开发客户端的东西,都有个共同点,那就是 数据请求! 看了下小程序的请求方式大概和a ...
- jquery Promise和ES6 Promise的区别
1. Deferred对象有resolve和reject方法,可以直接修改状态 jquery用Deferred实现了Promise规范,Deferred与ES6 Promise的最大区别是: Defe ...
随机推荐
- Django 中事务的使用
目录 Django 中事务的使用 Django默认的事务行为 在HTTP请求上加事务 在View中实现事务控制 使用装饰器 使用context manager autocommit() commit_ ...
- Linux安全审计
Client: OMAudit_agent.py #!/usr/bin/env python #coding:utf- import sys import socket import fcntl im ...
- react生态常用库分类
一. web项目 1.脚手架 create-react-app 自动安装react.react-dom 2.核心 react.react-dom 3.路由 react-router.react-rou ...
- CF 403D Beautiful Pairs of Numbers
The sequence of integer pairs (a1, b1), (a2, b2), ..., (ak, bk) is beautiful, if the following state ...
- 15、R语言聚类树的绘图原理
聚类广泛用于数据分析.去年研究了一下R语言聚类树的绘图原理.以芯片分析为例,我们来给一些样品做聚类分析.聚类的方法有很多种,我们选择Pearson距离.ward方法. 选择的样品有: "GS ...
- Spring Cloud Alibaba nacos 配置中心使用
背景 上一文我们讲到了如何去搭建注册中心,这一次我们讲述如何使用nacos作为注册中心 spring-cloud-alibaba-basis 创建基础依赖 首先我们创建一个spring-cloud-a ...
- vue+element 使用Export2Excel导出表格组件
下载表格组件是根据我自己的业务需求来封装的 使用的是vue中 xlsx 的插件,需要安装新的依赖及配置 仅供参考 不保证和你百分百匹配 安装依赖 npm install -S file-saver x ...
- int 问号的使用
单问号---为泛型 Nullable<int> 的简写方式. 双问号---用于判断前一个操作数是否为null,如为null则"返回"后一个操作数,否则"返回& ...
- Hybrid APP架构设计
通讯 作为一种跨语言开发模式,通讯层是Hybrid架构首先应该考虑和设计的,往后所有的逻辑都是基于通讯层展开. Native(以Android为例)和H5通讯,基本原理: Android调用H5:通过 ...
- Java 从无类型参数Map到有类型参数Map传值的一个问题
import java.util.HashMap; import java.util.Map; public class MapTest { public static void main(Strin ...