一   什么时候promise?

promise是异步编程的一个解决方案,是一个构造函数,身上带着all,resolve,reject,原型上有cath,then等方法

promise有两个特点:

1) 对象的结果不受外界影响,promise对象就代表一个异步操作,它有三种状态:pedding(进行中)  fulfiled(已完成)  rejected(已失败),只有异步操作的结果能够改变状态,其它任何操作都无法改变这个状态

2) 一旦状态改变,任何时候都会得到结果,而且不能够再改变这中状态. 状态的改变只有两种可能:pedding----->rulfiled     pedding--->rejected  只要这两种状态发生了,转态就凝固了,这时称resolved(已定型)

下面我们简单new promise一下

 let result= new Promise((resolve,reject)=>{
setTimeout(() => {
console.log("执行成功"); resolve("需要返回的数据接口")
}, 2000);
})

我们用打开页面,去控制台查看

执行过程: 执行一个异步操作,也就是settimeout,2s后打印执行成功,然后回调resolve方法

我们new promise对象的时候,自动执行了里面的内容,我们没有办法控制promise什么时候执行,

所以我们通常在使用它的时候在它的外面套一个函数,当我们需要用到它的时候去执行函数就可以了

<body>
<button onclick="btnClick()">执行操作</button>
</body>
<script>
function btnClick(){
let result = new Promise((resolve, reject) => {
setTimeout(() => {
console.log("执行成功"); resolve("需要返回的数据接口")
}, 2000);
})
return result
}

点击按钮,控制台结果输出:执行成功

放在函数中,我们返回的promise对象,对象身上有then,catch,all等方法了

上面的代码中还有resolve,它是什么呢  下面我们还是代码展示

 btnClick().then((data)=>{
console.log(data);
})

调用promise对象(也就是btnClick()的返回值)的then方法,then方法里面的参数是一个函数,该函数的参数接受resolve里面的返回值,这时就会输出:

这样一来,你应该就知道了原来then在btnClick执行异步操作完毕之后被执行,这就是promise的作用了.

promise只是能够简化层层调用的写法,而实质上最主要的精髓在于用维护转态,处理状态使得调用及时,相比于callback来说更加简单,灵活.

backcall方式

asyncFunc1(opt, (...args1) => {
asyncFunc2(opt, (...args2) => {
asyncFunc3(opt, (...args3) => {
asyncFunc4(opt, (...args4) => {
// some operation
})
})
})
})

可以看到,我们没增加一个异步请求,就会多添加一层回调函数的嵌套,这段代码中四个异步函数的嵌套已经开始使一段本可以语言明确的代码编程不易阅读与维护了

promise方式

new proimse((resolve,reject)=>{

  ansyncFunc1(opt,(...arg1)=>{

    resolve(result1)
  }) }).then((data1)=>{   return asyncFunc2(opt,(...args2)) }).then((data2)=>{   return asyncFunc3(opt,(...args2)) }).then((data3)=>{
  return asyncFunc3(opt,(...args2)) }).then((data4)=>{   some operation })

两者比较,虽然看起来,promise方式虽然看起来代码量庞大了,但是缺更容易理解了,而callback嵌套,使人看到特别头疼,而且会加大维护的难度.这就是promise优势所在.

reject用法

上面介绍了resove成功的时候的回调,就是讲promise的状态从pedding--->fulfiled的转态.而reject就是讲promise的状态从pedding--->rejected状态,这样我们就可以在then方法中捕获调用失败的信息

  function btnClick(){
let result = new Promise((resolve, reject) => {
setTimeout(() => {
var flag = false
if(flag){
resolve("成功拿到flag")
}else{
reject("没有拿到flag")
}
}, 2000);
})
return result
}
btnClick().then((data)=>{
console.log("接收resolve的数据--->"+data);
},(err)=>{
console.log("接收reject的回调--->"+err);
})

控制台打印

promise调用then方法时,往里面传了两个参数,第一个是接收resolve的函数,第二个是接收reject调用失败的函数

因为我们将flag设置的为false则执行reject然后then方法中捕获到调用失败的信息,并打印

catch的用法

与Promise对象方法then方法中第二个回调函数相同的一个方法就是catch,catch也是是用来捕获异常的.与then中的用法是一样的,

下面介绍一下它的强大之处

  function btnClick(){
let result = new Promise((resolve, reject) => {
setTimeout(() => {
var flag = true
if(flag){
resolve("成功拿到flag")
}else{
reject("没有拿到flag")
}
}, 2000);
})
return result
}
btnClick().then((data)=>{
console.log("接收resolve的数据--->"+nodata);
}).catch((err)=>{
console.log("接收reject的回调--->" +err);
})

控制台没有报错而是将报错的信息传给了catch,然后进行输出打印

这样的话,即使进入了resove的then方法中,有错误,也不会报错了

all的用法

all是与then同级的另一个方法,all方法,该方法提供了并行执行异步操作的能力,并且在所有异步操作执行完后并且执行结果都是成功的时候才执行回调。

function btn1(){
let result1 = new Promise((reslove,reject)=>{
setTimeout(()=>{
let num = parseInt(Math.random() * 20 + 1)
console.log("获得第一个数据");
reslove(num)
},1000)
})
return result1
}
function btn2(){
let result2 = new Promise((reslove, reject) => {
setTimeout(() => {
let num = parseInt(Math.random() * 20 + 1)
console.log("获得第二个数据");
reslove(num)
}, 2000);
})
return result2
}
function btn3() {
let result3 = new Promise((reslove, reject) => {
setTimeout(() => {
let num = parseInt(Math.random() * 20 + 1)
console.log("获得第三个数据");
reslove(num)
}, 3000);
})
return result3
}
Promise.all([btn1(),btn2(),btn3()]).then((result)=>{
console.log("获得全部数据,可以渲染页面");
console.log(result);
})

promise.all中的参数是一个promise对象的数组,然后执行,当他们全部执行完毕后,会生成一个数组,里面就是全部的数据.

分别执行得到结果,all统一执行完三个函数并将值存在一个数组里面返回给then进行回调输出,结果如下

all方法,通常是用在一个页面需要加载数据需要同时拥有才能去渲染的情况,例如上边的例子,需要获得三个数据,然后才可以渲染页面

race方法

all方法是全部执行完毕之后才返回结果,而race方法是最先执行完毕的可以进入race的回调,其余的就不能再进入了

function btn1() {
let result1 = new Promise((resolve, reject) => {
setTimeout(() => {
let num = parseInt(Math.random() * 20 + 1)
if(num>10){
console.log("4s获得第一个数据即将执行resolve");
resolve(num)
}else{
console.log("4s执行函数失败,即将执行reject");
reject("获取失败")
}
}, 4000)
})
return result1
}
function btn2() {
let result2 = new Promise((resolve, reject) => {
setTimeout(() => {
let num = parseInt(Math.random() * 20 + 1)
if(num>10){
console.log("2s获得第二个数据,即将执行resolve");
resolve(num)
}else{
console.log("2s执行函数失败,即将执行reject");
reject("获取失败")
}
}, 2000);
})
return result2
}
function btn3() {
let result3 = new Promise((resolve, reject) => {
setTimeout(() => {
let num = parseInt(Math.random() * 20 + 1)
if(num>10){
console.log("3s获得第三个数据,即将执行resolve");
resolve(num)
}else{
console.log("3s执行函数失败,即将执行reject");
reject("获取失败")
}
}, 3000);
})
return result3
}
Promise.race([btn1(), btn2(), btn3()]).then((result)=>{
console.log("获得数据:"+result);
console.log("回调完成");
}).catch((err)=>{
console.log(err);
})

控制台输出,第一个回调失败时,下面的不会再进入race回调

控制台输出,第一个回调成功时,下面的也不会再进入race回调

综上所述,就是用race方法时,先执行完的无论是resolve还是reject都将会进入race回调,并且后面的不会再进入回调.

race方法,应用场景:代码如下

    function btn1(){
let result = new Promise((resolve,reject)=>{
//异步请求,比ajax,axios等
resolve(data)
})
return result
}
function time(){
let result = new Promise((resolve,reject)=>{
setTimeout(() => {
reject("请求超时")
}, 10000);
})
return result
}
Promise.race([btn1(),time()]).then((data)=>{
console.log(data);
}).catch((err)=>{
console.log(err);
})

time()为一个异步操作10s的时间,让btn1()和它同时奔跑,如果btn1()在10s内获得数据,则显示数据,否则显示请求超时

这个就是看大佬们的博客,自己的一点理解,然后有不对的地方可以提出来,共同进步,讨论,学习,

下面时大佬博客的链接:https://blog.csdn.net/qq_34645412/article/details/81170576

ES6 promise用法总结的更多相关文章

  1. Es6 Promise 用法详解

     Promise是什么??    打印出来看看  console.dir(Promise) 这么一看就明白了,Promise是一个构造函数,自己身上有all.reject.resolve这几个眼熟的方 ...

  2. ES6 Promise 用法讲解

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

  3. ES6 Promise用法讲解

    所谓Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果. ES6 规定,Promise对象是一个构造函数,用来生成Promise实例. 下面代码创造了一个 ...

  4. ES6 Promise 用法转载

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

  5. 转--ES6 Promise 用法讲解

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

  6. ES6 Promise用法详解

    What is Promise? Promise是一个构造函数,接受一个参数(Function),并且该参数接受两个参数resolve和reject(分别表示异步操作执行成功后的回调函数.执行失败后的 ...

  7. es6 promise 所见

    一.Promise是什么? Promise 是异步编程的一种解决方案: 从语法上讲,promise是一个对象,从它可以获取异步操作的消息:从本意上讲,它是承诺,承诺它过一段时间会给你一个结果. pro ...

  8. ES6语法 promise用法

    ES6语法 promise用法 function doSomething(){ return new Promise((resolve,reject)=>{ resolve('jjjj');// ...

  9. es6的promise用法详解

    es6的promise用法详解 promise 原理 promise是es6的异步编程解决方案, 是es6封装好的对象: 一个promise有三种状态:Pending(进行中).Resolved(已完 ...

随机推荐

  1. 用TensorFlow搭建一个万能的神经网络框架(持续更新)

    我一直觉得TensorFlow的深度神经网络代码非常困难且繁琐,对TensorFlow搭建模型也十分困惑,所以我近期阅读了大量的神经网络代码,终于找到了搭建神经网络的规律,各位要是觉得我的文章对你有帮 ...

  2. MySQL不香吗,清华架构师告诉你为什么还要有noSQL?

    强烈推荐观看: 阿里P8架构师谈(数据库系列):NoSQL使用场景和选型比较,以及与SQL的区别_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili​www.bilibili.com noSQL的大概 ...

  3. Rocket - diplomacy - DUEB参数模型的设计

    https://mp.weixin.qq.com/s/9PEEpe1pkQDN9RWpOGSUCQ   介绍DUEB参数模型的设计,不包含实现(实现对设计做了简化).     1. DUEB   di ...

  4. Java实现 洛谷 P1060 开心的金明

    题目描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间他自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:"你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过NN元钱 ...

  5. Java实现蓝桥杯VIP算法训练 小生物的逃逸

    试题 算法训练 小生物的逃逸 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 空间中有n个球,这些球不相交也不相切.有m个可以视为质点的小生物,可能在某些球内,也可能在所有球之外,但 ...

  6. Java实现俄式乘法

    1 问题描述 首先,了解一下何为俄式乘法?此处,借用<算法设计与分析基础>第三版上一段文字介绍: 2 解决方案 package com.liuzhen.chapter4; public c ...

  7. java实现第二届蓝桥杯异或加密法

    异或加密法. 在对文本进行简单加密的时候,可以选择用一个n位的二进制数,对原文进行异或运算. 解密的方法就是再执行一次同样的操作. 加密过程中n位二进制数会循环使用.并且其长度也可能不是8的整数倍. ...

  8. mysql常见聚合函数

    count():总数量avg():平均数std():标准差sum():求和max():最大值min():最小值 上面的不过多介绍group_concat():分组列值全部展示到一行eg:mysql&g ...

  9. Controller是什么?

    控制器Controller 控制器复杂提供访问应用程序的行为,通常通过接口定义或注解定义两种方法实现. 控制器负责解析用户的请求并将其转换为一个模型. 在Spring MVC中一个控制器类可以包含多个 ...

  10. [转] 理解TCP序列号(Sequence Number)和确认号(Acknowledgment Number)

    点击阅读原译文 原文见:http://packetlife.net/blog/2010/jun/7/understanding-tcp-sequence-acknowledgment-numbers/ ...