HarmonyOS 鸿蒙Next 异步方法如何同步拿到返回结果

发布于 1周前 作者 phonegap100 来自 鸿蒙OS

HarmonyOS 鸿蒙Next 异步方法如何同步拿到返回结果 我想在Web的onInterceptRequest回调方法里拦截h5页面的html,js,css和png等资源请求,然后从本地磁盘找到对应文件后转成WebResourceResponse对象后返回给Web,从而实现离线加载页面的功能。现在通过在线地址找手机本地磁盘离线资源的方法是Promise异步返回的,怎么做可以实现同步返回

2 回复

您可以先设置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系统中,如果你需要在异步方法中同步拿到返回结果,可以采用以下几种方式,但请注意,这些方法通常涉及阻塞当前线程或利用回调机制进行结果收集,因此在实际开发中需权衡性能与用户体验。

  1. 使用同步工具:可以通过CountDownLatchCyclicBarrierSemaphore等同步工具类,在异步操作完成后通知主线程继续执行。这种方式虽然可以实现同步效果,但可能导致线程阻塞,影响系统响应性。

  2. Future与ExecutorService:提交异步任务到ExecutorService,并使用返回的Future对象获取结果。Future.get()方法会阻塞当前线程直到结果返回,适用于需要等待任务完成获取结果的场景。

  3. 自定义回调机制:在异步方法中添加回调接口,当异步操作完成时调用该接口的方法,将结果传递给主线程。这种方式避免了线程阻塞,但需要额外的代码来处理回调逻辑。

具体实现时,需根据业务场景选择合适的方案。值得注意的是,强制将异步操作转为同步可能会违背异步编程的初衷,即提高系统并发性和响应性。因此,在设计时应充分考虑这些因素。

如果问题依旧没法解决请联系官网客服,官网地址是 https://www.itying.com/category-93-b0.html

回到顶部