收藏
回答

Error: Expect END descriptor with depth

问题模块 框架类型 问题类型 终端类型 微信版本 基础库版本
框架 小程序 Bug 工具

- 当前 Bug 的表现(可附上截图)



Error: Expect END descriptor with depth 0 but get another


- 预期表现

不会出错


- 复现路径


Index页面结构:

-- CompA

---  CompB


场景:

CompA的wx:if由Index决定

CompB的wx:if由CompA决定


如果CompA关闭了,但是CompB的wx:if条件还在执行 =》 触发Bug


真实场景就是

CompA在2s会显示CompB的内容

但是如果CompA2s以内被关了,那么CompB就出错






详见代码片段



- 提供一个最简复现 Demo

自行代码片段

最后一次编辑于  03-25  (未经腾讯允许,不得转载)
回答关注问题邀请回答
收藏

2 个回答

  • 戴文亮
    戴文亮
    03-28

    A组件卸载了再去调用 this 当然是有问题的,你代码片段里的写法可以改用这两个生命周期方法:

    attached() {
        this.timer = setTimeout(() => {
          this.setData({
            comp_b_show: true
          })
        }, 2000)
      },
    detached() {
      clearTimeout(this.timer)
    }


    03-28
    赞同
    回复 3
    • 陈式坚
      陈式坚
      03-28

      例子里的setTimeout只是模拟而已


      真实的情况可能是

      1. 某个组件打开的时候,进行异步请求,在异步请求前用户关闭了组件 =》 报错

      2. 某个组件涉及到一个值,而这个值可能是全局或者异步的,导致一旦组件显示过,那么只要组件关闭 =》 报错



      主要是涉及到了wxml,导致其他代码也不能运行下去


      所以,希望的是

      1. 错误只在js里进行报错,不涉及wxml

      2. wx:if支持不同类型的值?(原理不清楚,只能猜测由于wxml也是转成js执行,而wx:if判断了传入值,导致报错)


      03-28
      1
      回复
    • 戴文亮
      戴文亮
      03-28回复陈式坚

      那这种情况你应该在A的父组件/页面来判断B,网络请求回来如果发现A都没了,B肯定也就不用渲染了

      03-28
      回复
    • 陈式坚
      陈式坚
      03-28回复戴文亮

      是的,所以我的临时方法就是在B组件去判断(wx:if="{{b_inst_shiw}}")B组件是否存在


      但这样有点不太友好?一旦涉及多层就得这样写兼容


      就是希望可以

      1. 不影响wxml的显示,wx:if的值默认为undefined也行,现在是直接不能继续了

      2. 不报这个错,而是在js里报错说明那个值没有

      03-28
      回复
  • 陈式坚
    陈式坚
    03-25

    我先来一个临时的解决办法吧

    既然我们知道如果CompB的wx:if判断时候CompA已经卸载了,那么就会出现Bug。

    那我们就可以在CompB的wx:if里多一个判断,判断CompA是否被卸载


    如何判断?

    只要在CompA的attached生命周期和dettached生命周期里设置一个开关就行,亲测可以临时解决


    更粗暴一点?

    如果CompA有引用组件,组件的父层(不限层级)有wx:if

    那么,我们在CompA的最顶层进行判断就可以



    只不过,作为临时方法,非常的不友好

    03-25
    赞同
    回复