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
您好,可以参考以下排查一下,如果还是不行的话可以提供下完整报错信息嘛
- 可以看下在entry/src/main路径下的module.json5中配置所需申请的权限了嘛
{
"module": {
"requestPermissions": [
{
"name": "ohos.permission.INTERNET"
},
{
"name": "ohos.permission.GET_NETWORK_INFO" // 如果使用PathPreference的'cellular'模式,则需要额外申请此权限
}
]
}
}
- 看下入参是否无效的Url链接,可以检查传入的Url参数或者直接使用HarmonyOS浏览器访问,确认Url是否可用
更多关于HarmonyOS鸿蒙Next中Session.fatch.then里的代码走不进去的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
估计是异步问题,这方面基础知识还不是很了解,我再研究研究,
好的,欢迎随时反馈~
在HarmonyOS Next中,Session.fetch().then()代码不执行通常与异步操作或Promise状态有关。检查网络请求是否成功返回,确保fetch的Promise已resolve。若请求失败或被取消,then不会触发。确认代码在ArkTS的异步上下文中执行,避免阻塞。使用catch或async/await调试错误。
根据你提供的代码,问题出在异步处理逻辑上。session.fetch(req) 是一个异步操作,它返回一个 Promise,但你的 get 方法在 then 或 catch 回调执行之前,就已经通过 Promise.resolve(rsp) 返回了初始化的 rsp 对象(状态为“请求成功”)。这意味着调用 RcpUtils.get() 时,返回的永远是那个初始化的 RspModel,而不会得到网络请求后的实际结果。
核心问题: get 方法没有正确返回 session.fetch() 这个 Promise 链。当前的代码结构使得异步操作 (fetch) 的结果无法传递给调用者。
修改建议:
你需要让 get 方法返回 session.fetch() 所产生的 Promise。修改后的代码应确保最终的 rsp 值来自 then 或 catch 回调。
以下是修改后的代码示例:
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));
}
}
主要改动点:
- 移除局部变量
rsp:不再需要提前创建rsp变量。 - 直接返回
session.fetch()的 Promise:return session.fetch(req).then(...).catch(...);这确保了get方法返回的是异步操作最终完成(或失败)后的结果。 - 在
then和catch中返回数据:在 Promise 链中,每个回调函数返回的值会成为链中下一个 Promise 的解析值。最终,get方法返回的 Promise 将解析为RspModel对象。 - 保持
try-catch:它用于捕获同步错误(例如rcp.createSession或new rcp.Request可能抛出的异常),并将其转换为一个已拒绝的 Promise(通过Promise.resolve包装错误结果,实际上这里用Promise.reject更合适,但你的RspModel设计似乎用于统一返回,所以保持resolve也可行)。
这样修改后,调用 RcpUtils.get() 的代码就能通过 .then() 或 await 接收到正确的响应或错误信息。


