vue3基础---Promise

这篇具有很好参考价值的文章主要介绍了vue3基础---Promise。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

Promise

1. 回调地狱

1.1 如何解决回调地狱的问题

1.2 Promise 的基本概念

2. 基于回调函数按顺序读取文件内容

3. 基于 then-fs 读取文件内容

3.1 then-fs 的基本使用

3.2 .then() 方法的特性

3.3 基于 Promise 按顺序读取文件的内容

3.4 通过 .catch 捕获错误

3.5 Promise.all() 方法

3.6 Promise.race() 方法

4. 基于 Promise 封装读文件的方法

4.1 getFile 方法的基本定义

4.2 创建具体的异步操作

4.3 获取 .then 的两个实参

4.4 调用 resolve 和 reject 回调函数

最后

Promise

1. 回调地狱

多层回调函数的相互嵌套,就形成了回调地狱。示例如下:

vue3基础---Promise

 回调地狱的缺点:

  • 代码耦合性太强,牵一发而动全身,难以维护

  • 大量冗余的代码相互嵌套,代码的可读性变差

1.1 如何解决回调地狱的问题

为了解决回调地狱的问题,ES6(ECMAScript 2015)中新增了 Promise 的概念。

1.2 Promise 的基本概念

① Promise 是一个构造函数

  • 我们可以创建 Promise 的实例 const p = new Promise()

  • new 出来的 Promise 实例对象,代表一个异步操作

② Promise.prototype 上包含一个 .then() 方法

  • 每一次 new Promise() 构造函数得到的实例对象,

  • 都可以通过原型链的方式访问到 .then() 方法,例如 p.then()

③ .then() 方法用来预先指定成功和失败的回调函数

  • p.then(成功的回调函数,失败的回调函数)

  • p.then(result => { }, error => { })

  • 调用 .then() 方法时,成功的回调函数是必选的、失败的回调函数是可选的

2. 基于回调函数按顺序读取文件内容

一层套一层,和1.回调地狱一样,这里就不做演示了。。。

3. 基于 then-fs 读取文件内容

由于 node.js 官方提供的 fs 模块仅支持以回调函数的方式读取文件,不支持 Promise 的调用方式。因此,需

要先运行如下的命令,安装 then-fs 这个第三方包,从而支持我们基于 Promise 的方式读取文件的内容:

npm install then-fs

3.1 then-fs 的基本使用

调用 then-fs 提供的 readFile() 方法,可以异步地读取文件的内容,它的返回值是 Promise 的实例对象。因

此可以调用 .then() 方法为每个 Promise 异步操作指定成功和失败之后的回调函数。示例代码如下:

import thenFs from 'then-fs'
​
thenFs.readFile('./files/1.txt', 'utf8').then((r1) => {console.log(r1)})
thenFs.readFile('./files/2.txt', 'utf8').then((r2) => {console.log(r2)})
thenFs.readFile('./files/3.txt', 'utf8').then((r3) => {console.log(r3)})

注意:上述的代码无法保证文件的读取顺序,需要做进一步的改进!

3.2 .then() 方法的特性

如果上一个 .then() 方法中返回了一个新的 Promise 实例对象,则可以通过下一个 .then() 继续进行处理。通

过 .then() 方法的链式调用,就解决了回调地狱的问题。

3.3 基于 Promise 按顺序读取文件的内容

Promise 支持链式调用,从而来解决回调地狱的问题。示例代码如下:

import thenFs from 'then-fs'
​
thenFs
  .readFile('./files/11.txt', 'utf8') //返回值是 Promise 的实例对象
  .catch((err) => {
    console.log(err.message)
  })
  .then((r1) => {
    console.log(r1)
    return thenFs.readFile('./files/2.txt', 'utf8')
  })
  .then((r2) => {
    console.log(r2)
    return thenFs.readFile('./files/3.txt', 'utf8')
  })
  .then((r3) => {
    console.log(r3)
  })

3.4 通过 .catch 捕获错误

在 Promise 的链式操作中如果发生了错误,可以使用 Promise.prototype.catch 方法进行捕获和处理:

import thenFs from 'then-fs'
​
thenFs.readFile('./files/1.txt','utf8').then((r1)=>{
  console.log(r1)
  return thenFs.readFile('./files/22.txt','utf8')
  .catch( err =>{   //通过 catch 捕获错误。但是从这里往后就不会捕获了。
    console.log(err)
  })
}).then((r2)=>{
  console.log(r2)
  return thenFs.readFile('./files/3.txt','utf8')
}).then((r3)=>{
  console.log(r3)
})
​
//运行结果是 读取出 r1  r2打印undefined  r3
//如果把 catch 放到最后,则遇到错误以后爆错误,错误后面就不会再执行了
//在这里把 catch 放到最后,就能读取出 r1 ,然后就爆err了,r2 ,r3 都不会读取出来

如果不希望前面的错误导致后续的 .then 无法正常执行,则可以将 .catch 的调用提前

3.5 Promise.all() 方法

Promise.all() 方法会发起并行的 Promise 异步操作,等所有的异步操作全部结束后才会执行下一步的 .then

操作(等待机制)。示例代码如下:

import thenFs from 'then-fs'
​
const promiseArr = [
  thenFs.readFile('./files/1.txt','utf8'),
  thenFs.readFile('./files/2.txt','utf8'),
  thenFs.readFile('./files/3.txt','utf8')
]
​
Promise.all(promiseArr).then(([r1,r2,r3])=>{
  console.log(r1,r2,r3)
})
.catch(err=>{
  console.log(err)
})

注意:数组中 Promise 实例的顺序,就是最终结果的顺序!

3.6 Promise.race() 方法

Promise.race() 方法会发起并行的 Promise 异步操作,只要任何一个异步操作完成,就立即执行下一步的

.then 操作(赛跑机制)。

示例代码如下:

import thenFs from 'then-fs'
​
const promiseArr = [
  thenFs.readFile('./files/3.txt', 'utf8'),
  thenFs.readFile('./files/2.txt', 'utf8'),
  thenFs.readFile('./files/1.txt', 'utf8'),
]
​
Promise.race(promiseArr).then(result => {
  console.log(result)
})
​
//最后就打印出一个,哪个读取快就打印哪个,读取出一个就立马停止后面的读取。
//有可能出r1 ,有可能出r3,不固定,谁快读取谁!

4. 基于 Promise 封装读文件的方法

方法的封装要求:

① 方法的名称要定义为 getFile

② 方法接收一个形参 fpath,表示要读取的文件的路径

③ 方法的返回值为 Promise 实例对象

4.1 getFile 方法的基本定义

// 1.方法的名称为 getFile
// 2.方法接收一个形参 fpath, 表示要读取的文件的路径
function getFile(fpath) {
    //3.方法的返回值为 Promise 的实例对象
    return new Promise()
}

注意:第 5 行代码中的 new Promise() 只是创建了一个形式上的异步操作。

4.2 创建具体的异步操作

如果想要创建具体的异步操作,则需要在 new Promise() 构造函数期间,传递一个 function 函数,将具体的

异步操作定义到 function 函数内部。

4.3 获取 .then 的两个实参

通过 .then() 指定的成功和失败的回调函数,可以在 function 的形参中进行接收。

4.4 调用 resolve 和 reject 回调函数

Promise 异步操作的结果,可以调用 resolve 或 reject 回调函数进行处理。

示例代码如下:

import fs from 'fs'
​
function getFile(fpath) {
  return new Promise(function (resolve, reject) {
    fs.readFile(fpath, 'utf8', (err, dataStr) => {
      if (err) return reject(err)
      resolve(dataStr)
    })
  })
}
​
getFile('./files/11.txt')
  .then((r1) => {
    console.log(r1)
  })
  .catch((err) => console.log(err.message))
​

最后

星月前端博客https://xingyue.vercel.app/

个人博客,记录前端学习笔记,欢迎收藏或者提意见。文章来源地址https://www.toymoban.com/news/detail-402751.html

到了这里,关于vue3基础---Promise的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Ajax】回调地狱解决方法

    回调地狱(Callback Hell)是指在异步编程中,特别是在嵌套的回调函数中,代码变得深度嵌套、难以阅读和维护的现象。这通常发生在处理多个异步操作时,每个操作都依赖于前一个操作的结果。回调地狱使代码变得难以理解、扩展和调试,降低了代码的可维护性和可读性。

    2024年02月13日
    浏览(36)
  • 解决微信小程序回调地狱问题

    一、背景     小程序开发经常遇到根据网络请求结果,然后继续 处理下一步业务操作,代码如下: 这段代特点:层层嵌套,逻辑负责可读性低,不易维护。解决方案使用 new Promise((resolve, reject) = {})可使用异步顺序执行来解决。 二、代码示例 第一个请求函数代码示例 第

    2024年02月09日
    浏览(52)
  • 记录--没有await,如何处理“回调地狱”

    不要嵌套使用函数。给每个函数命名并把他们放在你代码的顶层 利用函数提升。先使用后声明。 处理每一个异常 编写可以复用的函数,并把他们封装成一个模块 异步Javascript代码,或者说使用callback的Javascript代码,很难符合我们的直观理解。很多代码最终会写成这样: 看到

    2024年02月04日
    浏览(39)
  • 响应式编程Reactor优化Callback回调地狱

    Reactor 是一个基于Reactive Streams规范的响应式编程框架。它提供了一组用于构建异步、事件驱动、响应式应用程序的工具和库。Reactor 的核心是 Flux (表示一个包含零到多个元素的异步序列)和 Mono 表示一个包含零或一个元素的异步序列)。 Reactor 通过提供响应式的操作符,如

    2024年02月02日
    浏览(51)
  • 如何处理异步编程中的回调地狱问题?

    前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发者,这里都将为你提供一个系统而又亲切的学习平台。在这个

    2024年02月09日
    浏览(46)
  • HarmonyOS通过async与await同异步转换 解决异步回调地狱

    我在 HarmonyOS 发送http网络请求 中讲述了 HTTP请求的基本方式 然后 就带出了 回调地狱的问题 然后 上文 HarmonyOS 通过Promise 解决异步回调地狱问题 我们用Promise的解决方案 搞定了 这个问题 但是 Promise 这种写法 可读性其实没有那么优秀 没有搞定 Promise return规则的人甚至都看不懂

    2024年01月24日
    浏览(47)
  • uniapp微信小程序开发踩坑日记:uni.request回调函数地狱问题

    使用await和async无法解决uniapp中的回调函数地狱问题,因为uni.request并不返回一个 Promise。通常情况下,我们期望await能够等待一个 Promise 或者其它类似 Promise 的对象,然后继续执行下面的代码,但uni.request的 success 回调不符合这个预期 解决方案非常easy!改成用then来接收请求响

    2024年02月20日
    浏览(64)
  • 一盏茶的功夫帮你彻底搞懂JavaScript异步编程从回调地狱到async/await

     🎬 江城开朗的豌豆 :个人主页  🔥  个人专栏   :《 VUE 》 《 javaScript 》 ⛺️  生活的理想,就是为了理想的生活 ! 目录 📘 1. 引言 📘 2. 使用方法 📘 3. 实现原理 📘 4. 写到最后   在深入讨论 async/await 之前,我们需要了解一下 JavaScript 的单线程和非阻塞的特性。

    2024年02月08日
    浏览(50)
  • vue3+vue-router4:报错Uncaught (in promise) Error: Invalid navigation guard

    报错图示: Error: Invalid navigation guard Uncaught (in promise) Error: Invalid navigation guard 错误影响描述: 配置开发、测试、生产时候,因为是公众号,所以想在开发环境下免鉴权,不走微信获取openid接口,pinia中定义好openid直接进入项目,遂遇此问题。 因为在async和await中使用,导致n

    2024年02月17日
    浏览(56)
  • 深入理解 Promise、async、回调函数和 AJAX

    简介:本篇博客将介绍 Promise、async、回调函数和 AJAX,这些是在 JavaScript 中处理异步编程和数据交换的关键技术。我们将通过代码示例和解释来详细说明它们的基本用法和优势。 下面是一个简单的示例,展示 Promise 的基本用法: 在创建 Promise 对象时,传递的参数是一个执行

    2024年02月10日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包