首页 > 其他分享 >九、前端中的异步方法Promise,Promise详解

九、前端中的异步方法Promise,Promise详解

时间:2024-08-25 13:22:13浏览次数:12  
标签:异步 console log 打印 ---- 详解 Promise catch

文章目录

1.Promise简介

什么是promise

Promise是异步编程的一种解决方案,它的构造函数是同步执行的,then 方法是异步执行的。

为什么使用Promise

在JavaScript的世界中,所有代码都是单线程执行的。但是,很多网络操作,浏览器事件,都必须是异步执行,以保证软件的执行效率,毕竟如果用户发一个请求,网站在请求期间直接卡住,用户什么操作都做不了,是一个很糟糕的体验。异步f方法执行后的同步处理可以用回调函数实现,回调函数形式如下:

function callback() {
    console.log('Done');
}
doSometing(){
	.....
	callBack()
}

但是这样存在一个问题,比如我们先要向服务器请求数据A,得到A后,再通过A向服务器请求B,得到B后还需要得到C,最后才能真正用C来处理我们的数据,这时候就会有三层回调!

getA(function(A) {
  getB(A, function(B) {
    getC(B, function(C) {
      console.log('得到最终结果: ' + C);
    }, failureCallback);
  }, failureCallback);
}, failureCallback);

阅读上面代码,是不是很难受,上述形成了经典的 回调地狱。Promise就是用来处理这样的问题的。现在用promise来重写写这样的逻辑:

getA().then(function(A) {
  return getB(A);
})
.then(function(B) {
  return getC(B);
})
.then(function(C) {
  console.log('得到最终结果: ' + C);
})
.catch(failureCallback);

这样是不是变得清晰很多啦!
我们可以发现,promise的链式操作减低了编码难度,代码可读性明显增强。

promise中的状态

promise对象仅有三种状态
pending(进行中)
fulfilled(已成功)
rejected(已失败)

pedding(初始状态):调用promise时,一开始就呈现出等待状态,遇到resolve或者reject之前,都处于这个状态,且可以改变,但如果确定了状态(fulfilled/reject),则结果将永远不变,不能再次修改

fulfilled(成功状态):在执行了resolve后,promise则会从pedding变成fulfilled,后续会进入.then 的回调函数中,在回调函数的第一个参数函数中可以获取到值

rejected(失败状态):在执行了reject后,promise状态会变成rejected,rejected函数传递的参数,可以在.then的第二个参数函数中获取的到,或者是在.catch获取到,但是如果程序上的错误,得通过.catch函数去拿到失败消息,在.then中是获取不了的

认真阅读下图,我们能够轻松了解promise整个流程
在这里插入图片描述

2.Promis的用法

Promise对象是一个构造函数,用来生成Promise实例:

const p1 = new Promise((resolve, reject) => {
  resolve('hello');
})
.then(result => result)
.catch(e => e);

Promise构造函数接受一个函数作为参数,该函数的两个参数分别是resolve和reject。

resolve:用于创建一个成功状态的Promise对象,可以之间在.then的成功回调中,获取resolve的值。

const p = Promise.resolve("成功");
p.then((res) => {
  console.log("----打印:", res); //----打印: 成功
});
 
//该用法类似于
const p1 = new Promise((resolve, reject) => {
  resolve("成功");
});
p1.then((res) => {
  console.log("----打印:p1", res); //----打印:p1 成功
});
 
//后续代码中都会出现类似,或者另外中写法,尝试的时候,不能同时放出来执行

reject:这个方法跟Promise.resolve一样,只是作用不同,属于拒绝的状态;可以直接在.then的失败回调中,获取reject的值;也可以在.catch中获取;如果两者同时出现代码中,看看是catch写在前面还是.then函数写在前面 —业务中,拒绝状态用.then去执行回调,异常用.catch

const p = Promise.reject("失败");
p.then(
  (res) => {
    console.log("----打印:", res); //不执行
  },
  (rej) => {
    console.log("----打印:", rej); //----打印: 失败
  }
);
 
//另外写法 
p.then(
  (res) => {
    console.log("----打印:p", res); //不执行
  },
  (rej) => {
    console.log("----打印:p", rej); //----打印:p 失败
  }
).catch((error) => {
  console.log("----打印:catch", error); //不执行
});
 
//另外写法---基本没有吧catch写在第一个
p.catch((error) => {
  console.log("----打印:catch", error); //----打印:catch 失败
}).then(
  (res) => {
    console.log("----打印:p", res); //不执行
  },
  (rej) => {
    console.log("----打印:p", rej); //不执行
  }
);
 
//另外写法
p.then((res) => {
  console.log("----打印:p", res); //不执行
}).catch((error) => {
  console.log("----打印:catch", error); //----打印:catch 失败
});
 
//该用法类似于
const p1 = new Promise((resolve, reject) => {
  reject("失败");
});
p1.then(
  (res) => {
    console.log("----打印:p1", res); //不执行
  },
  (rej) => {
    console.log("----打印:p1", rej); //----打印:p1 失败
  }
);

另外,Promise构建出来的实例存在以下方法:

  • then()
  • catch()
  • finally()

then():
then是实例状态发生改变时的回调函数,第一个参数是resolved状态的回调函数,第二个参数是rejected状态的回调函数

getJSON("/posts.json").then(function(json) {
  return json.post;
}).then(function(post) {
  // ...
});

catch:
catch()方法是 .then(null, rejection) 或 .then(undefined, rejection) 的别名,用于指定发生错误时的回调函数.

getJSON('/posts.json').then(function(posts) {
  // ...
}).catch(function(error) {
  // 处理 getJSON 和 前一个回调函数运行时发生的错误
  console.log('发生错误!', error);
});

finally()
finally()方法用于指定不管 Promise 对象最后状态如何,都会执行的操作

promise
.then(result => {···})
.catch(error => {···})
.finally(() => {···});

标签:异步,console,log,打印,----,详解,Promise,catch
From: https://blog.csdn.net/qq_44849312/article/details/141527523

相关文章

  • C/C++语言基础--结构体知识详解(包括:结构体数组、字节对齐、位段等内容)
    本专栏目的更新C/C++的基础语法,包括C++的一些新特性前言C语言地结构体是核心内容之一,他运行自定义数据类型,可以将不同地数据类型当作成一个整体,变成一个数据类型,运用及其广泛欢迎点赞+收藏+关注,本人将会持续更新加粗样式文章目录结构体结构体是什么?结构体的申......
  • ATcoder368D题详解
    D题传送门一道很无脑的题,但考试没写出来爆搜首先看朴素算法1.从根节点开始遍历每个节点2.遇到要保存的节点就进行标记,直到所有保存节点都标记时间复杂度\(O(n)\)其实已经能过了,但我没用(doge)树链剖分(LCA)首先分析1.每一次砍掉枝叶,都是在没有要保存的节点存在子树上时2.......
  • Java线程池详解
    Java线程池解析在Java中有两种方式创建线程池,一种是直接使用Executors工具类创建预先定义好的线程池。一共有以下四种线程池newCachedThreadPool:可缓存的无边界的线程池,最大线程数Integer.MAX_VALUEpublicstaticExecutorServicenewCachedThreadPool(){returnnewTh......
  • OSPF路由原理详解与关键点
    目录一. OSPF简介:二. OSPF原理描述:三.  OSPF的核心内容: 四. OSPF的邻居关系和邻接五.LSA在各区域中传播的支持情况一. OSPF简介:开放式最短路径优先OSPF(OpenShortestPathFirst)是IETF组织开发的一个基于链路状态的内部网关协议(InteriorGatewayProt......
  • idea--pom文件坐标下载失败怎么办(史上最强详解)
            我们平常的项目实现,最基本也是第一个操作那肯定是在我们的pom文件里,写坐标下载坐标。但我们有时候进常会出现:坐标标红、坐标写的没有任何问题但就是下载不成功,又或是坐标写的没有问题,下载也显示ok,但我们再加入注解或者导包时却显示没有这个包。这里我整理了一......
  • 【Material-UI】Radio Group中的 Size 属性详解
    文章目录一、RadioGroup组件概述1.组件介绍2.基本用法二、Size属性详解1.`Size`属性的作用2.使用`Size`属性调整尺寸3.自定义SVG图标的大小三、Size属性的实际应用场景1.在密集布局中的应用2.强调选项的重要性3.与其他组件的结合使用四、注意事项1.......
  • 【C语言】进程和线程详解
    目录C语言进程和线程详解1.进程和线程的对比2.进程的基本概念2.1进程的定义2.2进程的特点2.3进程的生命周期3.进程管理3.1进程创建3.2进程间通信(IPC)3.2.1管道(Pipe)4.线程的基本概念4.1线程的定义4.2线程的特点5.POSIX线程库5.1引用头文件5.2创建线程......
  • C语言指针详解
    指针的概念:1.指针就是个变量,用来存放地址,地址唯一标识一块内存空间。2.指针的大小是固定的4/8个字节(32位平台/64位平台)。3.指针是有类型,指针的类型决定了指针的+-整数的步长,指针解引用操作的时候的权限。4.指针的运算1.字符指针在指针的类型中我们知道有一种指针类型......
  • [JavaEE] 工作流- Activiti7 框架详解
    目录1、Activiti介绍1.1、BPMN设计器1.2、常见流程符号1.2.1、事件event1.2.2、活动activiti1.2.3、流向flow2、入门案例2.1、需求说明2.2、初始环境2.2.1、添加依赖2.2.2、添加配置2.2.3、添加引导类2.2.4、启动项目2.2.5、表结构2.2.6、常见api2.3、绘制流......
  • 黑神话悟空 PC端配置需求详解:如何为不同游戏体验选择合适的配置?
    《黑神话:悟空》是一款备受期待的动作角色扮演游戏,由游戏科学(GameScience)开发,基于《西游记》改编。随着游戏的发布,许多玩家都在关心一件事:我的电脑能带动这款游戏吗?本文将详细介绍《黑神话:悟空》的最低配置和终极体验配置,并探讨不同配置的选择理由。最低配置需求:1080p中等画质......