0


Promise基本使用、三种状态、链式调用及简写、all方法

vue入门–基础命令+axios+案例练习
vue入门–vue常用属性、生命周期、计算属性、过滤器、组件、虚拟DOM、数组的响应式方法、页面闪烁、ES6简单语法增强
vue入门–js高阶函数(箭头函数)、v-model数据绑定、组件化、父子组件通信及访问
vue入门–插槽(具名、匿名、作用域插槽)+ES6模块化导入导出+webpack的使用(基本使用+配置使用+如何一步步演化成cli脚手架)+webpack插件使用(搭建本地服务器、配置文件分离)
vue-cli脚手架2版本及3+版本安装、目录解析、only和compiler的区别、3+版本如何改配置、箭头函数及this的指向
vue-router基本使用、路由传参、懒加载、嵌套路由、导航守卫、keep-alive
Promise基本使用、三种状态、链式调用及简写、all方法
Vuex的作用、使用、核心概念(State、Mutations、Getters、Actions、Modules)、文件抽离

Promise

介绍

ES6中一个非常重要和好用的特性就是Promise,

1.那么Promise是做什么的呢?

Promise是异步编程的一种解决方案

2.一般什么时候会处理异步事件呢?

​ 一种很常见的就是

网络请求

,一般网络请求都是需要时间等待返回数据的,但是我们又不想我们程序阻塞在那里,我们就需要使用异步编程,开启一个异步任务去执行网络请求,异步任务执行完毕后再进行函数的回调来处理数据。

基本使用

定时器异步事件

一般定时器,这么使用

// 使用 setTimeout,1s后执行打印 Hello WorldsetTimeout(()=>{
    console.log("Hello World")},1000);

封装定时任务,Promise是一个对象,使用时直接new

newPromise();

那么看下这个对象的函数(java中叫做有参构造函数)中,需要用到什么参数呢?

Promise(executor:(resolve:(value: any)=>void,reject:(reason?: any)=>void)=>void): Promise<any>

需要一个

executor

函数,executor函数中有有两个函数,

resolve

(解决)和

reject

(拒绝)

newPromise((resolve, reject)=>{// 1s后执行setTimeout中的函数回调,然后调用 resolve()又去回调了 then中的函数执行具体的操作setTimeout(()=>{resolve()// 执行resolve函数,再找then()执行},1000);}).then(()=>{
    console.log("Hello World");})

网络请求

上面是一个普通的定时任务,假如是网络请求后拿到了数据,我们改在哪里处理,怎么拿到该处理的数据呢?

newPromise((resolve, reject)=>{// 假如这里执行了网络请求
    处理网网络请求函数{function(res){resolve(res.data);// 成功时传入 数据,再走 then},function(err){reject("err message");// 失败时,传入错误信息});}).then(data=>{// 处理data数据,与页面进行交互}).catch(err=>{// 捕获异常,进行处理})

Promise三种状态

当我们开发中有异步操作时,可以给异步操作包装一个Promise。

了解一下:

sync : 同步操作

async : 异步操作

异步操作之后会有三种状态:

  • pending:等待状态,比如正在进行网络请求或者定时器未到时间
  • fulfilled:满足状态,我们主动调用了 resolve时,就处于此状态,并且会去回调.then()
  • rejected:拒绝状态,我们主动回调了reject时,处于该状态,并且会回调.catch()

其实除了上面说的 resolve回调then(),reject回调catch外,then中也可以同时处理resolve和reject。看一下then中需要的函数:

then(onfulfilled?:(value: any)=> any, onrejected?:(reason: any)=> PromiseLike<never>): Promise<any>

then中可接收两个函数,一个是处理fulfilled的(调用了resolve()的满足状态),另一个就是处理rejected的(调用了reject()的拒绝状态)。

具体实例:

newPromise((resolve, reject)=>{// 假如这里执行了网络请求
    axios.get("http://127.0.0.1:8080/app/report/test").then(function(res){resolve(res.data);},function(err){reject("err message");});}).then(data=>{// 成功时调用第一个函数// 处理数据 data},err=>{// 失败时,调用第二个函数// 处理错误信息
    console.log(err)})

Promise的链式调用

我们在使用Promise时无论是调用完then还是catch最后都会返回一个Promise对象。那么我们的代码其实是可以链式调用的

假如要完成一个情景,我们进行了网络请求拿到了数据 abc,然后需要给abc拼接一些东西,而且要拼接好几次,那么如何处理呢?

newPromise((resolve, reject)=>{setTimeout(()=>{resolve('abc')},1000);}).then(res=>{// 每次then执行完 返回一个 Promise对象
    console.log("第一层封装")returnnewPromise((resolve, reject)=>{resolve(res +"1111")})}).then(res=>{
    console.log("第二层封装")returnnewPromise(resolve=>{// new Promise,若只需要resolve函数,那么reject可省略resolve(res +"2222")})}).then(res=>{
    console.log(res,"返回结果")})

在这里插入图片描述

简写方式一:

上文中

returnnewPromise((resolve, reject)=>{resolve(res +"1111")})

可以简写为

return Promise.resolve(res +"1111")

具体实现:

newPromise((resolve, reject)=>{setTimeout(()=>{resolve('abc')},1000);}).then(res=>{
    console.log("第一层封装")return Promise.resolve(res +"1111")}).then(res=>{
    console.log("第二层封装")return Promise.resolve(res +"2222")}).then(res=>{
    console.log(res,"返回结果")})

简写方式二:

then中也会自动返回Promise的封装,也就是此句仍可简写:

return Promise.resolve(res +"1111")

简写为:

return res +"1111"

具体实现:

newPromise((resolve, reject)=>{setTimeout(()=>{resolve('abc')},1000);}).then(res=>{
    console.log("第一层封装")return res +"1111"}).then(res=>{
    console.log("第二层封装")return res +"2222"}).then(res=>{
    console.log(res,"返回结果")})

假如中间执行时,出现了故障

newPromise((resolve, reject)=>{setTimeout(()=>{resolve('abc')},1000);}).then(res=>{
    console.log("第一层封装")return Promise.reject("失败了")// 这里出现故障,执行了reject,会去直接找catch,其他跳过}).then(res=>{
    console.log("第二层封装")return res +"2222"}).then(res=>{
    console.log(res,"返回结果")}).catch(err=>{
    console.log(err)})

在这里插入图片描述

其实不止执行Promise.reject()走到catch中,我们手动抛出的异常,catch仍然可以捕获到。

// 方式一return Promise.reject("失败了")// 方式二throw"失败了"

Promise的all方法

假如有一个场景:需要两个网络请求都获取到数据后,再进行后续的数据处理。通常情况下我们是怎么处理的呢?我们可能会这么做:在每个回调方法内部都去执行一个函数,在这个函数中判断两个请求的数据是否都获取到了,然后再进行处理。

let result1 =falselet result2 =falseajax({url:"",success:function(){...
        result1 =truehandlerResult()}})ajax({url:"",success:function(){...
        result2 =truehandlerResult()}})functionhandlerResult(){if(result1 && result2){// 处理数据   }}

但是呢,过于麻烦。Promise为我们提供了这种场景的解决方案。

下面以setTimeout模拟网络请求延迟后,获取到数据

Promise.all([newPromise((resolve, reject)=>{setTimeout(()=>{resolve({name:"wlh1",age:21})},1000);}),newPromise((resolve, reject)=>{setTimeout(()=>{resolve({name:"wlh2",age:21})},2000);})]).then(results=>{// 只有当两个Promise包装的异步请求执行完以后,才会执行then中的
    console.log(results[0])// 第一个网络请求的结果
    console.log(results[1])// 第二个网络请求的结果})
vue入门–基础命令+axios+案例练习
vue入门–vue常用属性、生命周期、计算属性、过滤器、组件、虚拟DOM、数组的响应式方法、页面闪烁、ES6简单语法增强
vue入门–js高阶函数(箭头函数)、v-model数据绑定、组件化、父子组件通信及访问
vue入门–插槽(具名、匿名、作用域插槽)+ES6模块化导入导出+webpack的使用(基本使用+配置使用+如何一步步演化成cli脚手架)+webpack插件使用(搭建本地服务器、配置文件分离)
vue-cli脚手架2版本及3+版本安装、目录解析、only和compiler的区别、3+版本如何改配置、箭头函数及this的指向
vue-router基本使用、路由传参、懒加载、嵌套路由、导航守卫、keep-alive
Promise基本使用、三种状态、链式调用及简写、all方法
Vuex的作用、使用、核心概念(State、Mutations、Getters、Actions、Modules)、文件抽离
标签: javascript 前端 vue

本文转载自: https://blog.csdn.net/weixin_45248492/article/details/125243711
版权归原作者 鸢尾の 所有, 如有侵权,请联系我们删除。

“Promise基本使用、三种状态、链式调用及简写、all方法”的评论:

还没有评论