HarmonyOS 鸿蒙Next 异步方法如何同步拿到返回结果
HarmonyOS 鸿蒙Next 异步方法如何同步拿到返回结果 我想在Web的onInterceptRequest回调方法里拦截h5页面的html,js,css和png等资源请求,然后从本地磁盘找到对应文件后转成WebResourceResponse对象后返回给Web,从而实现离线加载页面的功能。现在通过在线地址找手机本地磁盘离线资源的方法是Promise异步返回的,怎么做可以实现同步返回
您可以先设置setResponseIsReady为false,那么内核此时不会去读取response的内容。当获取到fd后再将其改为true,此时内核才会去读取响应数据。参考demo:
import web_webview from '@ohos.web.webview';
import { BusinessError } from '@kit.BasicServicesKit';
@Component
struct WebComponent {
controller: web_webview.WebviewController = new web_webview.WebviewController()
responseResource: WebResourceResponse = new WebResourceResponse()
// 自定义响应数据
@State webData: string = `<!DOCTYPE html>
<html>
<head>
<title>intercept test22222</title>
</head>
<body>
<h1>intercept ok</h1>
</body>
</html>`
build() {
Column() {
Web({ src: $rawfile('index.html'), controller: this.controller })
.onInterceptRequest((event) => {
if (event) {
console.info('url:' + event.request.getRequestUrl());
// 拦截页面请求
if (event.request.getRequestUrl() !== 'https://www.example.com/test.html') {
console.log('拦截了')
return null;
}
}
try {
const promise: Promise<string> = new Promise((resolve: Function, reject: Function) => {
setTimeout(() => {
console.info('responseweb->setTimeout after wait');
// resolve('OK')
resolve(null)
}, 3000);
})
promise.then((result) => {
if(result==='OK'){
this.responseResource.setResponseData(this.webData);
this.responseResource.setResponseCode(200);
this.responseResource.setReasonMessage('OK');
this.responseResource.setResponseIsReady(true);
console.info('responseweb->set true');
}else{
this.responseResource.setResponseIsReady(false); //添加该逻辑
console.info('responseweb为null->set false');
}
}).catch((error: BusinessError) => {
console.error(error.message);
});
console.info('responseweb-> start setTimeout');
this.responseResource.setResponseMimeType('text/html');
this.responseResource.setResponseIsReady(false);
console.info('responseweb->set false');
return this.responseResource;
} catch (error) {
console.error('errorresponseweb->' + `${error.message}`);
return new WebResourceResponse();
}
})
}
}
}
更多关于HarmonyOS 鸿蒙Next 异步方法如何同步拿到返回结果的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS鸿蒙Next系统中,如果你需要在异步方法中同步拿到返回结果,可以采用以下几种方式,但请注意,这些方法通常涉及阻塞当前线程或利用回调机制进行结果收集,因此在实际开发中需权衡性能与用户体验。
-
使用同步工具:可以通过
CountDownLatch
、CyclicBarrier
或Semaphore
等同步工具类,在异步操作完成后通知主线程继续执行。这种方式虽然可以实现同步效果,但可能导致线程阻塞,影响系统响应性。 -
Future与ExecutorService:提交异步任务到
ExecutorService
,并使用返回的Future
对象获取结果。Future.get()
方法会阻塞当前线程直到结果返回,适用于需要等待任务完成获取结果的场景。 -
自定义回调机制:在异步方法中添加回调接口,当异步操作完成时调用该接口的方法,将结果传递给主线程。这种方式避免了线程阻塞,但需要额外的代码来处理回调逻辑。
具体实现时,需根据业务场景选择合适的方案。值得注意的是,强制将异步操作转为同步可能会违背异步编程的初衷,即提高系统并发性和响应性。因此,在设计时应充分考虑这些因素。
如果问题依旧没法解决请联系官网客服,官网地址是 https://www.itying.com/category-93-b0.html