首页 > 数据库 >异步操作的华尔兹,Promise详解,在ArkTs如何正确使用?如何使用Promise去封装Sqlite数据库?

异步操作的华尔兹,Promise详解,在ArkTs如何正确使用?如何使用Promise去封装Sqlite数据库?

时间:2024-07-25 16:55:25浏览次数:11  
标签:Function ArkTs resolve relationalStore Sqlite Promise reject new

目录

1.什么是Promise

2.Promise中的基本概念

3.理解Promise

4.Promise的重要方法

5.实战

我们可以使用Promise去封装一个Splite


1.什么是Promise

Promise是一种用于异步编程的模式,它提供了一种优雅的方式来处理异步操作的结果,避免了回调地狱问题。在Promise中,每一个Promise对象都有一个状态,该状态可以是fulfilled(已解决)或rejected(已拒绝)。

2.Promise中的基本概念

  • Promise:一个Promise对象代表一个异步操作的结果,它可以是fulfilled或rejected。
  • Resolve:通过resolve方法将Promise对象设置为fulfilled状态。
  • Reject:通过reject方法将Promise对象设置为rejected状态。
  • Then:在fulfilled状态下,可以执行一系列的操作,这些操作会随着异步结果的返回而执行。
  • Catch:在rejected状态下,可以捕获和处理异步操作的错误。

3.理解Promise

我觉得官方其实对于Promise的解释已经足够清楚了,但作为一个  ‘四谷牧抗议四囧比哦’ ,这里还是举个例子解释一下Promise

如果你好奇过,就会发现Promise翻译为中文其实是承诺的意思,既然如此,我们就可以把Promise想象成一种“未来的承诺”。

假设你在网上订购了一本书,商家给你一个承诺,说书会在三天内送到。在这三天里,你不会一直站在门口等着快递员,而是继续你的日常生活。当书到了,快递员会按门铃通知你(then),这时你就可以去收书了。如果书没有按时送达(catch),商家也会通知你延迟的原因。


在编程中,Promise 就像是商家对你的承诺。当你发起一个异步操作,比如网络请求,你不会让整个程序停下来等待结果,而是继续执行其他代码。Promise 会记住这个请求,并在操作完成后(无论是成功还是失败)通知你结果。如果请求成功,Promise 会调用一个成功的回调函数;如果请求失败,则会调用一个失败的回调函数。

总而言之,言而总之。

Promise 是一种优雅地处理异步操作的方式,它让你的程序可以“承诺”在将来某个时刻完成某个操作,并在操作完成时通知你,无论结果是好是坏。

4.Promise的重要方法

Promise对象提供了几个重要的方法:

  • then(onFulfilled, onRejected): 这个方法注册了两个回调函数,分别在Promise变为Fulfilled或Rejected状态时调用。onFulfilled和onRejected分别是成功和失败的回调函数,但onRejected是可选的。如果没有提供onRejected,并且Promise被拒绝,那么.then()方法会抛出一个错误,导致链式调用中断。
  • catch(onRejected): 这个方法只注册一个失败的回调函数,相当于.then(undefined, onRejected)。
  • finally(onFinally): 这个方法注册一个回调函数,无论Promise最终是被解决还是被拒绝,都会执行这个函数。

Promise对象还可以通过.all()和.race()静态方法组合多个Promise,其中.all()等待所有Promise都完成,而.race()则返回第一个完成的Promise的结果。
Promise的设计目的是为了简化异步编程模型,提供比传统的回调函数更清晰、更强大的错误处理和链式调用能力。

5.实战

使用Promise去封装一个Splite

首先做前期准备

  private dbName:string = 'shop_car.db'
  private dbSecurityLevel:relationalStore.SecurityLevel = relationalStore.SecurityLevel.S1
  private mRdbStory : relationalStore.RdbStore = null
  private mTableName : string = ''

接下来就是数据库三大步

初始化,创表,增删改查

初始化
  initRdb(dbName?:string,level?:relationalStore.SecurityLevel):Promise<void>{

        let ctx:Context = getContext(this) as Context
        let storeConfig:relationalStore.StoreConfig = {
            name : dbName? dbName :  this.dbName,
            securityLevel : level ? level : this.dbSecurityLevel
        }

        return new Promise((resolve:Function,reject:Function)=>{
          relationalStore.getRdbStore(ctx,storeConfig).then((rdbStore:relationalStore.RdbStore)=>{
            this.mRdbStory = rdbStore
            resolve()
          }).catch(()=>{
            reject(new Error(`${this.dbName}数据库初始化失败!!`))
          })
        })
    }
创表
 createTable(tableName:string,sql:string):Promise<void>{
      this.mTableName = tableName
      return new Promise((resolve:Function,reject:Function)=>{
        if(this.mRdbStory){
          console.debug('----------create  table-----------')
          this.mRdbStory.executeSql(sql).then(()=>{
            resolve()
          }).catch(()=>{
            reject(new Error(`${this.mTableName}表创建失败!!`))
          })
        }
      })
    }
增删改查
//3.插入数据
    insertData(values:relationalStore.ValuesBucket):Promise<number>{
      return new Promise((resolve:Function,reject:Function)=>{
        if(this.mRdbStory){
          console.debug('----------insert  data-----------')
          this.mRdbStory.insert(this.mTableName,values).then((num)=>{
            resolve(num)
          }).catch(()=>{
            reject(new Error(`${this.mTableName}表插入数据失败!!`))
          })
        }
      })
    }
    //4.查询数据
    queryData(predicates:relationalStore.RdbPredicates,columns:Array<string>):Promise<relationalStore.ResultSet>{
      return new Promise((resolve:Function,reject:Function)=>{
        if(this.mRdbStory){
          console.debug('----------query  data-----------')
          this.mRdbStory.query(predicates,columns).then((resultSet:relationalStore.ResultSet)=>{
            resolve(resultSet)
          }).catch(()=>{
            reject(new Error(`${this.mTableName}表查询数据失败!!`))
          })
        }
      })
    }
    //5.删除数据
    deleteData(predicates:relationalStore.RdbPredicates):Promise<number>{
      return new Promise((resolve:Function,reject:Function)=>{
        if(this.mRdbStory){
          console.debug('----------delete  data-----------')
          this.mRdbStory.delete(predicates).then((num)=>{
            resolve(num)
          }).catch(()=>{
            reject(new Error(`${this.mTableName}表删除数据失败!!`))
          })
        }
     })
    }
    //6.更新数据
    updateData(values:relationalStore.ValuesBucket,predicates:relationalStore.RdbPredicates):Promise<number>{
      return new Promise((resolve:Function,reject:Function)=>{
        if(this.mRdbStory){
          console.debug('----------update  data-----------')
          this.mRdbStory.update(values,predicates).then((num)=>{
            resolve(num)
          }).catch(()=>{
            reject(new Error(`${this.mTableName}表更新数据失败!!`))
          })
        }
      })
    }

如此一来,大功告成。

标签:Function,ArkTs,resolve,relationalStore,Sqlite,Promise,reject,new
From: https://blog.csdn.net/chen2023_11_14/article/details/140690503

相关文章

  • lazarus使用unidac+sqlite,用dbgrid显示float字段时遇到的问题
    遇到的问题:网友海使用过程发现,lazarus使用unidac+sqlite,用dbgrid显示float字段时遇到数据库的字段内容明明有多位小数,但在dbgrid只显示1位小数和截图最后1行显示1.1E2等问题。 在Navicat显示的表内容:这是他的解决方法: 修改UniConnection1的DataTypeMapping,将float映射为s......
  • 如何使用 SQLite ?
    SQLite是一个轻量级、嵌入式的关系型数据库管理系统(RDBMS)。它是一种C库,实现了自给自足、无服务器、零配置、事务性SQL数据库引擎。SQLite的源代码是开放的,完全在公共领域。它被广泛用于各种应用程序,包括浏览器、操作系统、移动应用等。SQLite的基本特性轻量级:SQLite......
  • Android Studio查看SQLite数据库(快速方便)
    在AndroidStudio不要使用databasenavigator/DBNavigator/DBBrowser插件查看SQLite数据库,因为AndroidStudio自带的Appinspection工具可以快捷的查看当前项目的SQLite数据库。使用教程找到Appinspection位置1,就在左下角的工具栏位置2,右键左边偏上的工具栏的moret......
  • [转]从SQLite到Redis:探索C++与多种数据库的交互之道
    转自:【C++风云录】从SQLite到Redis:探索C++与多种数据库的交互之道开启数据库之旅:通过C++与各种数据库交互,事半功倍1.SQLite1.1简介SQLite是一个嵌入式关系型数据库管理系统,提供了一个轻量级的C++接口。它是一个开源的软件库,无需配置服务器或安装管理工具,可以直接在程序中使......
  • 如何使用 Python Flask 将新的咖啡馆(元素)添加到数据库(SQLite)?
    这是我的代码:@app.route("/add",methods=["POST"])defpost_new_cafe():new_cafe=Cafe(name=request.form.get("name"),map_url=request.form.get("map_url"),img_url=request.form.get("img......
  • vue3 Promise处理异步操作的对象
    Promise是JavaScript中用于处理异步操作的一种对象。它代表了一个异步操作的最终完成(或失败)及其结果值。在处理异步操作时,Promise提供了一种更干净、更可读的方式来管理回调函数。Promise的状态一个Promise对象有三种状态:Pending(进行中):初始状态,操作尚未完成。Fulfille......
  • SQLite数据库在Android中的使用
    目录一,SQLite简介二,SQLIte在Android中的使用1,打开或者创建数据库2,创建表3,插入数据4,删除数据5,修改数据 6,查询数据三,SQLiteOpenHelper类四,SQLite中事务的处理一,SQLite简介        SQLite是一个无服务器的,零配置的,事务性的SQL数据库引擎。无服务器,意味着使......
  • SQLite修改字段类型的方法
    SQLite不支持直接修改字段类型,如需要修改字段类型,可按以下方法处理:1、将要修改的字段名改名2、用新的类型添加字段3、复制原字段的内容4、删除旧字段procedureSQLiteAlter(TableName,ColName,NewFileType:string);varsql:string;beginsql:='ALTERTABLE'+TableN......
  • ArkTS语法---函数、方法和接口
    一、函数 1、函数声明        函数声明引入一个函数,包含其名称、参数列表、返回类型和函数体。        在函数声明中,必须为每个参数标记类型。如果参数为可选参数,那么允许在调用函数时省略该参数。函数的最后一个参数可以是rest参数。functionadd(x:st......
  • 简化Android数据管理:深入探索SQLite数据库
    SQLite数据库在Android中的使用SQLite是一种精巧的、轻量级的、无服务器的、零配置的、事务性SQL数据库引擎。相较于其他数据库系统,SQLite更适用于需要轻量级解决方案的移动应用场景。本文将详细介绍SQLite数据库在Android中的使用,包括数据库的创建、表的建立、数据的增删......