HarmonyOS鸿蒙Next中Session.fatch.then里的代码走不进去

HarmonyOS鸿蒙Next中Session.fatch.then里的代码走不进去

import { rcp } from '@kit.RemoteCommunicationKit';
import { RspModel } from '../viewmodel/RspModel';
// import { UserInfo } from '../viewmodel/UserInfo';

export class RcpUtils {
  static securityConfig: rcp.SecurityConfiguration = {
    tlsOptions: {
      tlsVersion: 'TlsV1.3'
    }
  };

  static get(url: string, headers?: rcp.RequestHeaders): Promise<RspModel> {
    // 定义请求头
    if (!headers) {
      headers = {
        'Content-Type': 'application/json'
      }
    }

    let rsp: RspModel = new RspModel("000000", "请求成功");

    // 创建通信会话对象
    try {
      const session = rcp.createSession({ requestConfiguration: { security: RcpUtils.securityConfig } });
      // 定义请求对象rep
      let req = new rcp.Request(url, 'GET', headers, '');
      // 发起请求
      session.fetch(req).then((response) => {
        if (response.statusCode === 200) {
          rsp = response.toJSON() as RspModel;
        } else {
          rsp = new RspModel("100000", "请求失败");
        }
      }).catch((err: BusinessError) => {
        rsp = new RspModel("100000", "请求失败", err);
      });
    } catch (error) {
      rsp = new RspModel("200000", "请求失败", error);
    }

    return Promise.resolve(rsp);
  }
}

更多关于HarmonyOS鸿蒙Next中Session.fatch.then里的代码走不进去的实战教程也可以访问 https://www.itying.com/category-93-b0.html

6 回复

您好,可以参考以下排查一下,如果还是不行的话可以提供下完整报错信息嘛

  1. 可以看下在entry/src/main路径下的module.json5中配置所需申请的权限了嘛
{
    "module": {
    "requestPermissions": [
       {
          "name": "ohos.permission.INTERNET"
       },
       {
          "name": "ohos.permission.GET_NETWORK_INFO" // 如果使用PathPreference的'cellular'模式,则需要额外申请此权限
       }
     ]
   }
}
  1. 看下入参是否无效的Url链接,可以检查传入的Url参数或者直接使用HarmonyOS浏览器访问,确认Url是否可用

更多关于HarmonyOS鸿蒙Next中Session.fatch.then里的代码走不进去的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


估计是异步问题,这方面基础知识还不是很了解,我再研究研究,

希望HarmonyOS能加强与其他品牌设备的兼容性,让更多人受益。

好的,欢迎随时反馈~

在HarmonyOS Next中,Session.fetch().then()代码不执行通常与异步操作或Promise状态有关。检查网络请求是否成功返回,确保fetch的Promise已resolve。若请求失败或被取消,then不会触发。确认代码在ArkTS的异步上下文中执行,避免阻塞。使用catchasync/await调试错误。

根据你提供的代码,问题出在异步处理逻辑上。session.fetch(req) 是一个异步操作,它返回一个 Promise,但你的 get 方法在 thencatch 回调执行之前,就已经通过 Promise.resolve(rsp) 返回了初始化的 rsp 对象(状态为“请求成功”)。这意味着调用 RcpUtils.get() 时,返回的永远是那个初始化的 RspModel,而不会得到网络请求后的实际结果。

核心问题: get 方法没有正确返回 session.fetch() 这个 Promise 链。当前的代码结构使得异步操作 (fetch) 的结果无法传递给调用者。

修改建议:

你需要让 get 方法返回 session.fetch() 所产生的 Promise。修改后的代码应确保最终的 rsp 值来自 thencatch 回调。

以下是修改后的代码示例:

static get(url: string, headers?: rcp.RequestHeaders): Promise<RspModel> {
    // 定义请求头
    if (!headers) {
        headers = {
            'Content-Type': 'application/json'
        };
    }

    // 创建通信会话对象
    try {
        const session = rcp.createSession({ requestConfiguration: { security: RcpUtils.securityConfig } });
        // 定义请求对象req
        let req = new rcp.Request(url, 'GET', headers, '');
        
        // 直接返回 fetch 返回的 Promise,并在其链式调用中处理响应和错误
        return session.fetch(req).then((response) => {
            if (response.statusCode === 200) {
                // 成功时返回解析后的JSON数据
                return response.toJSON() as RspModel;
            } else {
                // 状态码非200时返回失败模型
                return new RspModel("100000", "请求失败");
            }
        }).catch((err: BusinessError) => {
            // 捕获网络或请求错误,返回失败模型
            return new RspModel("100000", "请求失败", err);
        });
        
    } catch (error) {
        // 同步错误(如创建session失败)在这里捕获
        return Promise.resolve(new RspModel("200000", "请求失败", error));
    }
}

主要改动点:

  1. 移除局部变量 rsp:不再需要提前创建 rsp 变量。
  2. 直接返回 session.fetch() 的 Promisereturn session.fetch(req).then(...).catch(...); 这确保了 get 方法返回的是异步操作最终完成(或失败)后的结果。
  3. thencatch 中返回数据:在 Promise 链中,每个回调函数返回的值会成为链中下一个 Promise 的解析值。最终,get 方法返回的 Promise 将解析为 RspModel 对象。
  4. 保持 try-catch:它用于捕获同步错误(例如 rcp.createSessionnew rcp.Request 可能抛出的异常),并将其转换为一个已拒绝的 Promise(通过 Promise.resolve 包装错误结果,实际上这里用 Promise.reject 更合适,但你的 RspModel 设计似乎用于统一返回,所以保持 resolve 也可行)。

这样修改后,调用 RcpUtils.get() 的代码就能通过 .then()await 接收到正确的响应或错误信息。

回到顶部