微信小程序wepy使用leancloud报Maximum call stack size exceeded错误

核心代码如下:

    async onLoad() {
      this.serviceProviders = await this.network().getProviders();
      this.$apply();
    }

    /*放置网络访问函数*/
    network() {
      let self = this;
      return {
        async getProviders() {
          let user = AV.User.current();
          let userLocation = user.get('location');
          let serviceProviders = await new AV.Query('ServiceProvider')
            .equalTo('status', 0)
            .withinKilometers('defCertLocation', userLocation, 1000.0)
            .find();
          // let newServiceProviders = []
          for (let i = 0; i < serviceProviders.length; i++) {
            let sp = serviceProviders[i];
            sp.set('fcategorys', await sp.relation('categorys').query().find());
            let defCertLocation = sp.get('defCertLocation');
            let distance = (defCertLocation.kilometersTo(userLocation)).toFixed(2);
            sp.set('distance', distance);
            // newServiceProviders.push(sp.toJSON())
          }
          // return newServiceProviders;
          return serviceProviders;
        }
      };
    }

报如下错误:

如果修改成以下代码则不会报错:

async onLoad() {
      this.serviceProviders = await this.network().getProviders();
      this.$apply();
    }

    /*放置网络访问函数*/
network() {
  let self = this;
  return {
    async getProviders() {
      let user = AV.User.current();
      let userLocation = user.get('location');
      let serviceProviders = await new AV.Query('ServiceProvider')
        .equalTo('status', 0)
        .withinKilometers('defCertLocation', userLocation, 1000.0)
        .find();
      let newServiceProviders = []
      for (let i = 0; i < serviceProviders.length; i++) {
        let sp = serviceProviders[i];
        sp.set('fcategorys', await sp.relation('categorys').query().find());
        let defCertLocation = sp.get('defCertLocation');
        let distance = (defCertLocation.kilometersTo(userLocation)).toFixed(2);
        sp.set('distance', distance);
        newServiceProviders.push(sp.toJSON())
      }
      return newServiceProviders;
      // return serviceProviders;
    }
  };
}

使用leancloud版本是最新的3.11.0,请问一下是什么问题?而且好多地方都会报这个错误!

我能问一下,之后对 return 的 newServiceProviders 做了什么操作?是 setData 的时候抛异常了吗?还是后续有 console.log?

你好,没做什么操作,你在onLoad方法里面能看到,this.serviceProviders = await this.network().getProviders();这个代码就相当于是setData操作

我用你的代码与测试数据在微信开发者工具试了下直接 setData 是没有问题的,我需要去用 wepy 复现一下看到底做了什么。

原来另外一个项目使用原生小程序的setData没出现这种问题,在wepy里面使用会出问题!

我试了没有问题。

我是用你的 appid 测试的,上面的代码你可以本地运行看看。

那我这里会是什么问题呢,新建的项目也没引入什么第三方的库,基本上是leancloud的库!

我建议你先按照我发的项目的配置升级一下依赖什么的。如果你愿意也可以直接在这个基础上开发。因为我现在无法复现你说的现象因此也不知道什么问题。

频繁报这类错误!!!

和wepy的兼容性有待提高啊!调用toJSON()就没这个错误!

我已经提供一个项目使用您应用的数据与您提供的代码证明了是没有问题的,你可以克隆这个项目来验证这一点。

如果你希望我们继续帮你看这个问题,我建议你提供一个完整可运行的能复现问题的项目代码。

找到原因了,是因为引用了另外一个组件库导致的,但是转成数据转成json却没问题,这是什么原因?

也许那个组件污染了一些原生或全局的方法吧。

确实有这个问题哦,要在真机上打开调试做测试,才会复现。
真机关闭调试,不会报错。
微信开发工具,不会报错。

小程序提交审核时,会由于这个问题,导致审核不通过!如果改代码时,忘记打开调试,就会遗漏。

av-weapp-min.js v3.10.0

 AV.User.loginWithAuthData(...).then(user => {
    // 以下方式,在微信开发工具正常,在真机调试模式下报错Maximum call stack size exceeded
    console.log(user);
    this.setData({user});
    
    // 以下方式,在微信开发工具正常,在真机调试模式下正常
    console.log(user.toJSON());
    this.setData({user: user.toJSON()});
})

这个原因是返回的对象里有很多function,估计js在真机上打log的时候就会发生一些问题,出现一些跟递归相关的问题,这个感觉跟代码运行的环境有一些关系,之前也没有出现过,可能是微信的小程序内核改了什么东西

1 人赞了这个帖子.