1.Promise对象

Promise 对象用于表示一个异步操作的最终完成 (或失败)及其结果值。其作用是为了解决回调地狱

回调地狱:回调函数的结果作为下一个回调函数的参数时,产生回调链,也称之为回调地狱。

例如:通过请求获取用户ID,再通过ID获取用户名,在通过用户名获取用户年龄

$.ajax({
type: "GET",
url: "test.json",
dataType: "json",
success: function(data){
let {id}=data
$.ajax({
type: "GET",
url: "test.json",
data:{id:id},
dataType: "json",
success: function(data){
let {useName}=data
$.ajax({
type: "GET",
url: "test.json",
data:{useName:useName},
dataType: "json",
success: function(data){
let {msg}=data
}
);
}
);
}
);

由于ajax是异步请求,只能等请求获取到数据之后,变量才能被赋值作为下次请求的数据,因此只能放在ajax请求内部在发送请求,此时就构成了回调地狱。

2.Promise的使用

promise是一个构造函数,可以通过new来获取Promise对象

new Promise((resolve,reject)=>{})

参数是一个回调函数,回调函数有两个参数:

resolve:修改状态为成功的函数

reject:修改状态为拒绝的函数

首先打印promise对象

promise有两个重要的属性:

state:promise对象的状态

result:promise返回结果

3.promise的状态

promise有三个状态

pending:待执行

fulfilled:已完成

rejected:已拒绝

而修改状态是通过resolve()和reject()来修改的

<script>
var p=new Promise((resolve,reject)=>{
resolve()
})
var p2=new Promise((resolve,reject)=>{
reject()
})
console.log(p);
console.log(p2);
</script>

注意:promise的状态一旦被改变将无法再进行修改

var p=new Promise((resolve,reject)=>{
resolve()
reject()
})

状态是已完成,在调用reject函数也无法再进行修改。

4.promise的结果

promise的结果主要是通过promise对象参数的回调函数的两个参数的参数决定的

resolve(result):修改状态为已完成,并将promise的结果赋值为result
reject(error):修改状态为已拒绝,并将promise的结果赋值为error
   <script>
const p= new Promise((resolve, reject) => {
resolve("成功结果")
})
const p2= new Promise((resolve, reject) => {
reject("失败结果")
})
console.log(p);
console.log(p2);
</script>

5.promise的then方法

then方法接收两个参数,两个参数都是一个回调函数

  • 第一个参数为回调函,表示状态为已完成的时候调用,该回调函数结构resolve函数的参数作为参数
  • 第二个参数为回调函数,表示状态为已拒绝的时候调用,该回调函数结构reject函数的参数作为参数
<script>
const p= new Promise((resolve,reject)=>{
let a="qq"
resolve(a)//resolve函数调用相当执行了then方法的第一个参数回调函数
})
p.then((res)=>{//res表示的是resolve函数的参数,
console.log("then成功",res);
},(error)=>{
console.log("then失败",error);
})
</script>
<script>
const p= new Promise((resolve,reject)=>{
let a="错了"
reject(a)//reject函数调用相当执行了then方法的第二个参数回调函数
})
p.then((res)=>{
console.log("then成功",res);
},(error)=>{
console.log("then失败",error);//res表示的是reject函数的参数,
})
</script>

6.then方法的返回值

then方法有一个返回值,返回一个新的promise对象,其状态为一个pending。

<script>
const p =new Promise((res,rej)=>{
res(123)
})
const t=p.then(res=>{
return res
},error=>{
return error
})
const a=t.then(res=>{
console.log("1",res);
return res+12
},error=>{
console.log('2',error);
})
a.then(res=>{
console.log("ha",res);
},error=>{
console.log("ww",error)
})
</script>

我们这里可以看到,then方法返回一个新的promise对象,这个新对象的状态为pending。

我们可以在then的回调函数使用return就可以将其状态改成fulfilled,在回调函数内代码出错,状态将会变成rejected。

	<script>
const p =new Promise((res,rej)=>{
res(123)
})
const t=p.then(res=>{
console.log(a);
},error=>{
})
t.then(res=>{
console.log("1",res);
},error=>{
console.log('2',error);
})
</script>

7.promise的catch方法

catch的执行条件:

  • promise的catch方法会在状态为rejected的时候执行
  • promise内部代码有问题的时候执行
  • promise向外抛出错误的时候执行
	<script>
const p=new Promise((res,rej)=>{
rej("500:服务器出错!")
})
p.catch(err=>{
console.log(err);
})
const p2=new Promise((res,rej)=>{
console.log(a);
})
p2.catch(err=>{
console.log("chu",err);
})
</script>

所以一般我们都不使用then方法的第二个函数来捕获错误,而是使用catch来不会promise的rejected状态。

这个可以各管各的,代码更加清晰。

8,解决回调地狱

<script>
const p=new Promise((res,rej)={
$.ajax({
type: "GET",
url: "test.json",
dataType: "json",
success: function (data) {
let { id } = data
res(id)
},
error:function(error){
rej(error)
}
})})
const a= p.then(res=>{
$.ajax({
type: "GET",
url: "test.json",
dataType: "json",
data: { id: res },
success: function (data) {
let { useName } = data
return useName
},
error: function (error) {
throw new error("出错了")
}
})
})
a.then(res=>{
$.ajax({
type: "GET",
url: "test.json",
dataType: "json",
data: { useName: res },
success: function (data) {
let { msg } = data
console.log("已经获取用户信息");
},
error: function (error) {
throw new error("出错了")
}
})
})
</script>

es6高级~promise的更多相关文章

  1. ES6的promise对象研究

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

  2. ES6的Promise

    推荐一下我觉得不错关于Promise的好文章,通俗易懂 说起ES6的Promise就要提及一下JQ的$.when()方法,两者基本相同 面试的时候经常会问Promise,如果同学们能在回答Promis ...

  3. ES6语法 promise用法

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

  4. 浅谈ES6原生Promise

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

  5. ES6之Promise用法详解

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

  6. ES6中promise总结

    一.什么是ES6的Promise 讲太多也没有.直接在打印出来就好,console.dir(Promise) Promise 是一个构造函数,自身有all, reject, resolve 这几个眼熟 ...

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

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

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

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

  9. 解读Es6之 promise

            单线程:  在同一时间只能有同一任务进行.JavaScript就是一门单线程语言                 当有多个任务需要进行时,则需要进行排队,前一个执行完毕才能执行下一个; ...

  10. 【前端开发】】ES6属性promise封装js动画

    如下是我写的demo源码: 可以直接复制用浏览器打开看到效果哦: <!DOCTYPE html> <html> <head> <meta charset=&q ...

随机推荐

  1. Hibernate双向关联导致Java对象转换为JSON字符串时死循环问题的分析与解决方案

    引言: 本文描述了在SSH框架中,多个持久层对象相互引用,从而引发分页查询中,查询所得的持久化对象转换为JSON字符串报错的原因及解决方案 使用EasyUI框架的小伙伴们都知道,在使用datagrid ...

  2. 如何用 Unity 做出一只赛博宠物

    推荐的一些学习资料 unity 官方文档:Unity 用户手册 (2019.4LTS) - Unity 手册 视频教程:https://www.bilibili.com/video/BV1zB4y1C ...

  3. 自用电脑+外网开放+SSL认证(纯免费)

    背景: 本文的目的主要是为了方便大家测试,不过有条件的情况下没必要学习了.主要是给那些没有服务器,公司也不给ssl认证的开发测试人员的一种方案:就像题目所说的那样. 纯免费,纯免费的话是有学习成本的, ...

  4. 打开 gpedit.msc 组策略时弹出错误提示,"找不到资源 string.Advanced_EnableSSL3Fallback ”。

    原因是升级到 IE9 或者 IE 11 语言包没有及时更新. 解决方案一:用360再打补丁. 方案二:未尝试. https://www.microsoft.com/en-us/download/con ...

  5. LangChain让LLM带上记忆

    最近两年,我们见识了"百模大战",领略到了大型语言模型(LLM)的风采,但它们也存在一个显著的缺陷:没有记忆. 在对话中,无法记住上下文的 LLM 常常会让用户感到困扰.本文探讨如 ...

  6. CM 停用 Parcel 异常

    在将Doris集成到CM时,第一次打的包存在问题,想更新下,停用.删除Parcel时出现了问题卡住了,一直显示75%.无奈换了名称和版本,分配.激活,然后又卡在了75%,点开后,发现是同一台机器.其a ...

  7. 增补博客 第八篇 python 中国大学排名数据分析与可视化

    [题目描述]以软科中国最好大学排名为分析对象,基于requests库和bs4库编写爬虫程序,对2015年至2019年间的中国大学排名数据进行爬取:(1)按照排名先后顺序输出不同年份的前10位大学信息, ...

  8. es创建索引及别名更新mapping方法 elasticsearch [nested] nested object under path [XXX] is not of nested type

    [nested] nested object under path [XXX] is not of nested type这是因为在创建索引时没有指定类型为数组,这就是一个大坑,ES官方说可以不用指定 ...

  9. spark读取写入jdbc.,Caused by: java.lang.NoSuchMethodException: org.apache.spark.sql.execution.datasources.jdbc.DriverWrapper.<init>()

    df.write .option("truncate", "true") .option("driver", mysqlDriver) .m ...

  10. tortoisegit 配置ssh登录

    习惯使用小乌龟. 服务器:gitblit 客户端:TortoiseGit 2.13.0.1 (C:\Program Files\TortoiseGit\bin) git version 2.36.1. ...