首页 > 其他分享 >【鸿蒙】---鸿蒙Next小课堂之Promise

【鸿蒙】---鸿蒙Next小课堂之Promise

时间:2024-06-04 23:59:03浏览次数:11  
标签:异步 resolve err 鸿蒙 res --- Promise reject

前言

Promise是一种用于处理异步操作的对象,可以将异步操作转换为类似于同步操作的风格,以方便代码编写和维护。简而言之:Promise 用来管理异步,方便编码。

这时候该有人要问了,怎么区分异步和同步呢?

同步代码:逐行执行,需原地等待结果后,才继续向下执行。
异步代码:调用后耗时,不阻塞代码继续执行,将来完成后,触发回调函数传递结果。
划重点:异步代码的结果,通过 回调函数 获取。

Promise 状态

Promis有三种状态:pending(进行中)、fulfilled(已完成)和rejected(已拒绝)。

  1. 待定(pending): 初始状态,既没有被兑现,也没有被拒绝
  2. 已完成(fullfilled): 意味着操作成功完成
  3. 已拒绝(rejected): 意味着操作失败

在这里插入图片描述

注意:状态的改变不可逆
调用 resolve 之后再调用 reject,状态还是 已兑现,反之亦然

Promise 什么用法

Promise对象创建后处于pending状态,并在异步操作完成后转换为fulfilled或rejected状态。所以使用Promise 来管理异步任务主要有三个步骤,分别对应:

  1. 内部执行异步代码
  // 实例化 Promise 对象
  const p = new Promise<string>(() => {
    // 执行任意代码,主要是异步
    setTimeout(() => {
      // 比如:获取随机数
      const randomNum = Math.floor(Math.random() * 100)
      console.log('随机数是:', randomNum)
    })
  })
}
  1. 传递成功结果
const p = new Promise<string>((resolve) => {
    // 执行任意代码,主要是异步
    setTimeout(() => {
      // 比如:获取随机数
      const randomNum = Math.floor(Math.random() * 100)
      resolve(randomNum.toString())
    })
  })

  p.then(res => {
    console.log('res:', res)
  })
  1. 传递失败结果
  const p = new Promise<string>((resolve,reject) => {
      // 执行任意代码,主要是异步
      setTimeout(() => {
        // 比如:获取随机数
        const randomNum = Math.floor(Math.random() * 100)
        // resolve(randomNum.toString())
        reject(randomNum.toString())
      })
    })

    p.then(res => {
      console.log('res:', res)
    },(err:string)=>{
      console.log('err:',err)
    })

做个总结就是

    const p = new Promise<string>((resolve, reject) => {
      // 执行任意代码,主要是异步
      // 成功 resolve(成功结果) then 执行
      // 失败 reject(失败结果) then第二个回调函数或 catch 执行
    })

    p.then(res => {}, (err: string) => {})
    
    p.then(res=>{}).catch((err:string)=>{})

Promise 为什么用

如果回调函数一直【嵌套】下去,代码的可读性会非常糟糕。
一般在多个异步操作【彼此依赖】的时候会出现回调函数嵌套的情况,(c 依赖 b,b 依赖 a),就会产生以下的情况。

promise对象a.then(res1=>{
  promise对象b.then(res2=>{
    promise对象c.then(res3=>{
      promise对象d.then(res4=>{
        //.... 可以一直写下去
      })
    })
  })
})

上述写法就叫做回调函数地狱

Promise 怎么用

这种写法较为繁琐,所以我们可以使用 Promise 的链式编程来解决这个问题。

这里是引用

这样写是 Promise 对象的特性:
Promise 的 then 方法会返回一个新Promise 对象
then 方法的返回值会影响这个 新Promise对象的结果

简单表述出来就是

promise对象
.then(() => {
// 略
}).then(()=>{
// 略
}).then(()=>{
// 略
})

在代码里的具体实现为

function randomNum(delay: number): Promise<string> {
  return new Promise<string>((resolve, reject) => {
    const num = Math.floor(Math.random() * 100)
    resolve(num.toString())
  })
}

randomNum(1000)
  .then(res => {
    console.log('随机数1:', res)
    return randomNum(2000)
  })
  .then(res => {
    console.log('随机数2:', res)
    return randomNum(3000)
  })
  .then(res => {
    console.log('随机数3:', res)
    return randomNum(3000)
  })

Promise 的静态方法

日常开发中除了使用 Promise 对象以外,还可以通过 Promise 提供的静态方法来管理多个异步。

Promise.resolve
返回一个成功原因的 Promise 对象

Promise.resolve('hello resolve')
  .then(res => {
    AlertDialog.show({ message: res })
  })

Promise.reject
返回一个拒绝原因的 Promise 对象

Promise.reject('hello reject')
  .catch((err: string) => {
    AlertDialog.show({ message: err })
  })

Promisse.race
传入 Promise 数组,第一个成功或者失败

const p1 = new Promise<string>((resolve, reject) => {
  setTimeout(() => {
    resolve('2')
  }, 2000)
})
const p2 = new Promise<string>((resolve, reject) => {
  setTimeout(() => {
    reject('1')
  }, 1000)
})
Promise.race([p1, p2, 'Harmony']).then((res) => {
  console.log('res:', res)
}, (err:string) => {
  console.log('err:', err)
})

Promise.all
多个 Promise,全部成功,或者第一个失败

const p1 = new Promise<string>((resolve, reject) => {
  setTimeout(() => {
    resolve('1')
  }, 2000)
})
const p2 = new Promise<string>((resolve, reject) => {
  setTimeout(() => {
    reject('2')
  }, 1000)
})
Promise.all([p1, p2, 'Harmony'])
  .then((res) => {
    console.log('res:', res)
  }, (err: string) => {
    console.log('err:', err)
  })

标签:异步,resolve,err,鸿蒙,res,---,Promise,reject
From: https://blog.csdn.net/qq_45774739/article/details/139455930

相关文章

  • Element Plus el-tooltip嵌套el-popover
    1.场景需求在按钮中鼠标移入显示Tooltip文字提示,点击显示Popover提示框2.实现el-tooltip与el-popover之间需要有一层dom元素<template><el-tooltipeffect="dark":show-after="500"content="功能开发"placement="right"><spanref="dom&qu......
  • (十五)统计学基础练习题九(选择题T401-450)
    本文整理了统计学基础知识相关的练习题,共50道,适用于想巩固统计学基础或备考的同学。来源:如荷学数据科学题库(技术专项-统计学三)。序号之前的题请看往期文章。401)402)403)404)405)406)407)408)409)410)411)412)413)414)415)416)417)418)419)420)421)422)......
  • QShop商城-API权限控制
    QShop商城-API权限控制在使用Qs.WebApi过程中,系统会对所有的Api进行权限控制。如果没有登录就访问Api接口,会提示"认证失败,Token无效或已超时",如下图: 如果想正常调用,必需先调用登录接口/api/Check/Login拿到登录token,如下: 把token值放置在httpheaderX-Token中,即可正......
  • 数据治理--数据服务
                             ......
  • 基于双向长短时记忆神经网络结合多头注意力机制BiLSTM-Mutilhead-Attention实现柴油机
    %加载数据集和标签load(‘diesel_dataset.mat’);%假设数据集存储在diesel_dataset.mat文件中data=diesel_dataset.data;labels=diesel_dataset.labels;%数据预处理%这里假设你已经完成了数据的预处理,包括特征提取、归一化等步骤%划分训练集和测试集[tra......
  • upload-labs第二关教程
    upload-labs第二关教程第一关的教程可以去主页里面去找。文章目录upload-labs第二关教程1.源代码审计2.MIME类型是什么?3.绕过方法分析1)修改content-typea.上传一个eval.php文件b.然后使用Burpsuite进行抓包修改content-typec.放包:d.打开开发者工具e.使用中国蚁剑进......
  • 【免杀】-哥斯拉魔改(入门)
    目录魔改哥斯拉-JAR反编译打包构建1、反编译Jar2、新建项目,lib文件夹,添加源码3、配置模块工件4、简单测试一下关闭哈希效验魔改哥斯拉-防识别-打乱特征指纹抓包获取流量特征哥斯拉的三个强特征修改强特征魔改哥斯拉-防查杀-新增后门插件1、获取shell生成逻辑2、......
  • java框架-日志-体系与级别-技巧
     体系一是提供了统一的日志门面API,即图中紫色部分,实现了中立的日志记录API。二是桥接功能,即图中蓝色部分,用来把各种日志框架的API(图中绿色部分)桥接到SLF4JAPI。这样一来,即便你的程序中使用了各种日志API记录日志,最终都可以桥接到SLF4J门面API。三是适配功能,即图......
  • java-框架-lombok
    1.@Data@Data注解在类上,会为类的所有属性自动生成setter/getter、equals、canEqual、hashCode、toString方法,如为final属性,则不会为该属性生成setter@DatapublicclassUser{privateIntegerid;privateStringusername;privateDatebirthday;priva......
  • QShop商城-API权限控制
    QShop商城-API权限控制在使用Qs.WebApi过程中,系统会对所有的Api进行权限控制。如果没有登录就访问Api接口,会提示"认证失败,Token无效或已超时",如下图: 如果想正常调用,必需先调用登录接口/api/Check/Login拿到登录token,如下:把token值放置在httpheaderX-Token中,即可正......