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

目录

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}表更新数据失败!!`))
          })
        }
      })
    }

如此一来,大功告成。

  • 27
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值