首页 > 其他分享 >【HarmonyOS】Web组件使用setResponseIsReady+setResponseData实现异步自定义响应数据

【HarmonyOS】Web组件使用setResponseIsReady+setResponseData实现异步自定义响应数据

时间:2023-12-12 10:36:02浏览次数:33  
标签:Web setResponseData console 自定义 web responseResource setResponseIsReady event

【问题描述】

在web组件的自定义响应数据方法如下:

Web().onInterceptRequest((event) => {
…
})

如果需要在callbak中如果使用Promise等获取异步信息,并读取该如何操作

 

【解决方案】

通过setResponseIsReady + setResponseData的方式控制数据返回,先设置setResponseIsReady为false,此时Web内核不会去读取response的内容。当获取到数据后再将其改为true后,Web内核才会去响应数据,参考以下demo: 

前端页面index.html代码:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
</head>
<body>
<!-- 页面资源请求 -->
<a href="https://www.example.com/test.html">intercept test!</a>
</body>
</html>

应用侧代码:

// xxx.ets
import web_webview from '@ohos.web.webview';

@Entry
@Component
struct WebComponent {
  controller: web_webview.WebviewController = new web_webview.WebviewController()
  responseResource: WebResourceResponse = new WebResourceResponse()
  // 开发者自定义响应数据
  @State webData: string = '<!DOCTYPE html>\n' +
  '<html>\n'+
  '<head>\n'+
  '<title>intercept test</title>\n'+
  '</head>\n'+
  '<body>\n'+
  '<h1>intercept ok</h1>\n'+
  '</body>\n'+
  '</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') {
              return null;
            }
          }
          try {
			 //模拟异步请求
            new Promise((resolve)=>{
              setTimeout(() => {
                console.info('responseweb->setTimeout after wait');
                resolve('OK')
              }, 3000);
            }).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');
              }
            });

            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('responseweb->' + `${error.message}`);
            return new WebResourceResponse();
          }
        })
    }
  }
}

标签:Web,setResponseData,console,自定义,web,responseResource,setResponseIsReady,event
From: https://www.cnblogs.com/mayism123/p/17896219.html

相关文章

  • 车机 Android 环境下利用 CarAudioService 实现自定义 Java 服务自启动
    注意:本文基于Android11进行分析Qidi2023.11.28(MarkDown&Haroopad)0.简介AndroidRO(ResourceOverlay)机制Overlay实现的效果正如其字面意思,就是“在原有效果的基础上再叠加一些效果”。Android提供了两种实现方式:编译时:https://source.android.com/docs/set......
  • 车机 Android 环境下利用 CarAudioService 实现自定义 Java 服务自启动
    注意:本文基于Android11进行分析Qidi2023.11.28(MarkDown&Haroopad)0.简介AndroidRO(ResourceOverlay)机制Overlay实现的效果正如其字面意思,就是“在原有效果的基础上再叠加一些效果”。Android提供了两种实现方式:编译时:https://source.android.com/docs/set......
  • 车机 Android 环境下利用 CarAudioService 实现自定义 Java 服务自启动
    注意:本文基于Android11进行分析Qidi2023.11.28(MarkDown&Haroopad)0.简介AndroidRO(ResourceOverlay)机制Overlay实现的效果正如其字面意思,就是“在原有效果的基础上再叠加一些效果”。Android提供了两种实现方式:编译时:https://source.android.com/docs/set......
  • Unreal C++自定义Actor设置StaticMesh和Material
    1.新建第三人称c++游戏(其它模板开局也可以的)2.新建继承自Actor的c++类3.添加静态网格体成员SM_MyActor,并在构造函数中进行相应的初始化UCLASS()classMYPROJECT9S_APIAMyActor:publicAActor{GENERATED_BODY()protected:/**Pleaseaddavariabledescripti......
  • 微信小程序自定义顶部导航栏并适配不同机型
    前言在小程序中,顶部导航栏是一个非常重要的组件,它不仅可以方便用户进行页面切换,还可以提高用户体验。默认情况下,小程序的顶部导航栏是由系统自动生成的,我们只能修改一些基本的样式,如背景色、文字颜色等。但是,如果想要实现更加复杂的样式,如自定义图标、自定义背景等,而且在不同的手......
  • 【SpringBootWeb入门-9】分层解耦-分层解耦(IOC-DI引入)
    1、分层解耦概念上一节我们讲解了三层架构,我们把web程序分为了三层,分别是Conroller控制层、Service业务逻辑层、DAO数据访问层,这一节我们来讲解分层之后的解耦。解耦的含义就是接触耦合,首先我们来介绍两个概念:内聚、耦合。内聚:软件中各个功能模块内部的功能联系。耦合:衡量软......
  • Dest0g3-web部分wp
    最近的大赛很多,但是在群里也不会做,而且事比较多,所以就找点简单的小比赛查漏补缺一下,因为感觉自己基础不是很牢固。phpdest<?phphighlight_file(__FILE__);require_once'flag.php';if(isset($_GET['file'])){require_once$_GET['file'];}require_once跟直接include......
  • power query自定义列和条件列
    Excel从基础到M函数PowerQuery超级整理建议使用office365进入PQ:选中表格任意位置——开始——数据——自表格区域——勾选表包含标题——确定——进入PQ编辑器 要使用PQ编辑器,表格只能支持两种格式:1、公式里设置表格名称(选中表格任意位置——数据——自表格/区域——‘创......
  • .net6 webapi Swagger显示控制器为版本及接口注释
    1.安装Nuget包:Swashbuckle.AspNetCore2.使用Swagger中间件builder.Services.AddEndpointsApiExplorer();builder.Services.AddSwaggerGen(option=>{//要启用swagger版本控制要在api控制器或者方法上添加特性[ApiExplorerSettings(GroupName="版本号")] typ......
  • 耐心极限大挑战,整蛊小游戏之「禁止向上走」【玩转Web小游戏】
    故事是这样开始的很久很久以前,我关注的一个游戏博主,发了一个游戏视频。然后我就见识到了什么叫,「游戏叫你一步噶,你绝对走不到第二步」。这个带那么点整蛊的性质的脑洞游戏,瞬间引起了我浓厚的兴趣。需要玩家克服大脑常规套路的惯性,那岂不是游戏处处是惊喜。不过,游戏的本质还是在于趣......