在onBackPress中实现退出拦截时不生效

现象描述

在快应用中弹出一个弹窗,期望效果是该弹窗在用户确认后再退出,但是使用onbackpress控制确认弹窗后自动退出不生效。

问题分析

快应用引擎实现机制决定了onbackpress不能有耗时的操作。当超过一段时间后,如果代码还没有处理完,就会按返回值为false处理,即默认关闭该页面。问题代码中通过$watch监听showResult的变化,若变化则执行fetch操作,而这些操作可能还没执行完,从而导致弹窗自动关闭。
问题代码如下:

1.  onBackPress() {
2.    console.log("main onBackPress. status = " + this.showResult);
3.    if (this.showResult) {
4.      this.$element('textarea').focus({ focus: false });
5.      this.content = '';
6.      this.touchedIndex = -1;
7.      //解决因监听showResult变化后的事件处理过缓问题,导致系统返回键有时失效
8.      this.showResult = false;
9.      return true;10.   }
11.   return false;
12. },
13. initDataWatchConfig() {
14.   let that = this;
15.   this.$watch('showResult', (newV, oldv) => {
16.     if (!that.showResult) {
17.       audio.stop();
18.       this.getphoto()//此处是一个比较耗时的操作,以fetch举例,只有清除数据后第一次打开可以复现
19.     }
20.   });
21. },
22. getphoto: function () {
23.   var that = this
24.   fetch.fetch({
25.     url: ' 
26.     success: function (ret) {
27.     },
28.     fail: function (msg, code) {
29.     }
30.   })}

解决方法

给耗时比较长的操作增加延时。为this.showResult = false增加一个延时,优化后的代码如下:

1.  onBackPress() {
2.    console.log("main onBackPress. status = " + this.showResult);
3.    if (this.showResult) {
4.      this.$element('textarea').focus({ focus: false });
5.      this.content = '';
6.      this.touchedIndex = -1;
7.      //增加延时,解决因监听showResult变化后的事件处理过缓问题,导致系统返回键有时失效
8.      setTimeout(() => {
9.          this.showResult=false; 
10.     }, 800);
11.     return true;
12.   }
13.   return false;
14. }

原文链接:https://developer.huawei.com/consumer/cn/forum/topic/0204411119222660356?fid=18

原作者:Mayism

posted @ 2021-03-08 09:23  华为开发者论坛  阅读(1667)  评论(0编辑  收藏  举报