HarmonyOS鸿蒙Next中动态数据Promise

HarmonyOS鸿蒙Next中动态数据Promise 指南:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/http-request

所有的任务都可以分为:

  • 同步任务:立即执行的任务,同步任务一般会直接进入到主线程中执行
  • 异步任务:异步执行的任务,比如ajax网络请求,setTimeout定时函数等

同步任务与异步任务的运行流程图:

cke_10007.png

promise是es6提出的一个概念,主要用来决绝异步回调的问题,是一个数据容器,保存了未来的一个结果。

promise本身是可以用来存放同步代码和异步代码

//resolve,reject  是两个函数
new Promise((resolve,reject)=>{

})

以上浅聊了下Promise,下面就通过Promise来实现http请求的封装。

为什么这么干?

在实际写代码的时候很多页面需要通过接口获取数据,那么就要写无数个http的请求,功能可以实现,但不够优雅。为了后期代码方便维护。以下讨论对http进行封装和对外暴露的一种设计方案。

封装工具

import { http } from "@kit.NetworkKit";
import { JSON } from "@kit.ArkTS";

// 这里的T是返回类型,K是参数类型
export function HtpRequest<T,K>(
  url: string,
  method: http.RequestMethod,
  requestData?: K) {
  const httpRequest = http.createHttp()
  // 在ArkTs中resolve,reject需要指明数据类型
  return new Promise<(value: Record<string,T>) => void, (value?: string) => void>((resolve, reject) => {
    // 监听响应头没啥用,可以删掉
    httpRequest.on('headersReceive', (header) => {
      console.info('header:' + JSON.stringify(header))
    })

    httpRequest.request(url, {
      method: method,
      header: {
        // 告诉后端你的数据是什么类型,text、json、二进制
        'Content-type': 'application/json'
      },
      // 通过JSON.stringify(requestData)把requestData转字符串。原始这个参数格式应该是'id=xx&name=xx',为了避免复杂业务导致这个参数写的又臭又长,实现接收一个对象{id:xx,name:xx}
      extraData: JSON.stringify(requestData)|| '',
      connectTimeout: 6000,
      readTimeout: 6000
    }, (error: Error, data: http.HttpResponse) => {
      if (!error) {
        resolve((JSON.parse(data.result as string)) as Record<string,T>)
        // 当该请求使用完毕时,调用destroy方法主动销毁
        httpRequest.destroy()
      } else {
        reject(error.message)
        // 当该请求使用完毕时,调用destroy方法主动销毁
        httpRequest.destroy()
      }
    })
  })
}

这个方法写在shared模块中,对外暴露get post put delete请求

export function htpRequestGet<T, K>(url: string, requestData?: K): Promise<Record<string, T>> {
  return htpRequest<T, K>(url, http.RequestMethod.GET, requestData)
}

export function htpRequestPost<T, K>(url: string, requestData?: K): Promise<Record<string, T>> {
  return htpRequest<T, K>(url, http.RequestMethod.POST, requestData)
}

export function htpRequestPut<T, K>(url: string, requestData?: K): Promise<Record<string, T>> {
  return htpRequest<T, K>(url, http.RequestMethod.PUT, requestData)
}

export function htpRequestDelete<T, K>(url: string, requestData?: K): Promise<Record<string, T>> {
  return htpRequest<T, K>(url, http.RequestMethod.DELETE, requestData)
}

在index.ets中暴露

export { htpRequestGet,htpRequestPost,htpRequestPut,htpRequestDelete } from './src/main/ets/utils/HttpUtils'

在不同业务中使用网络请求,把所有请求封装到指定的页面,一个业务模块一个页面来管理

import { htpRequestGet } from "common";

// 获取轮播图
export function findSwiperDataApi<T,K>(){
  return htpRequestGet<T,K>('/home/swiperdata')
}
// 获取分类信息
export function  findCategoryDataApi<T,K>(){
  return htpRequestGet<T,K>('/home/catitems')
}
export function  findProductDataApi<T,K>(){
  return htpRequestGet<T,K>('/goods/search')
}
export function  findProductDataByIdApi<T,K>(params:K){
  return htpRequestGet<T,K>('/goods/searchById',params)
}

如何使用

aboutToAppear(): void {
    this.fetchSwiperData()
    this.fetchActivityData()
    this.fetchProductsData()
  }
  // 获取轮播图
   fetchSwiperData= async () =>{
    const res=await findSwiperDataApi<Array<SwiperDataModel>,null>()
    this.swiperData=res.message
  }

  fetchActivityData= async () =>{
    const res=await findCategoryDataApi<Array<ActivityDataModel>,null>()
    this.activityTitle=res.message
  }

  fetchProductsData= async () =>{
    const res=await findProductDataApi<Array<ProductDataModel>,null>()
    this.products=res.message
  }

这样做优势:页面完全没有请求代码。不管你的请求如何修改(请求路径请求参数)都不会影响页面的代码


更多关于HarmonyOS鸿蒙Next中动态数据Promise的实战教程也可以访问 https://www.itying.com/category-93-b0.html

1 回复

更多关于HarmonyOS鸿蒙Next中动态数据Promise的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,Promise 是一种用于处理异步操作的对象,类似于JavaScript中的 Promise。它表示一个可能在未来完成或失败的操作,并允许你以更清晰的方式处理异步逻辑。

在鸿蒙Next中,Promise 的基本用法如下:

  1. 创建Promise: 使用 Promise 构造函数,传入一个执行器函数(executor),该函数接受 resolvereject 两个参数。

  2. 处理结果: 使用 then 方法处理成功的结果,使用 catch 方法处理失败的情况。

  3. 链式调用: 可以通过链式调用 thencatch 来处理多个异步操作。

示例代码:

let promise = new Promise((resolve, reject) => {
  // 模拟异步操作
  setTimeout(() => {
    if (Math.random() > 0.5) {
      resolve("成功");
    } else {
      reject("失败");
    }
  }, 1000);
});

promise
  .then(result => console.log(result))
  .catch(error => console.error(error));

通过 Promise,你可以更优雅地管理异步任务,避免回调地狱,并提高代码的可读性和可维护性。

回到顶部