:0:too much recursion">

记一次:JS: :0:too much recursion

起因

在为 cocos2d-js 集成一个 sdk 时,设置了 sdk 的回调函数:

obj.setListener({
    onCallback: function(data) { console.log(data); }
});

输出 log 的代码是:

JS_CallFunctionName(cx, obj, func_name, JS::HandleValueArray::fromMarkedLocation(sizeof(dataVal)/sizeof(*dataVal), dataVal), &retval);
JS: :0:too much recursion

一如既往,放狗,得到链接: http://discuss.cocos2d-x.org/t/new-too-much-recursion-error-after-upgrading/6856/2,并没有什么卵用!

实际上这是错误的方向,观察 XCode 的 线程,发现在非主线程访问了 SpiderMonkey 的资源。

如何修复

把回调函数的代码放到主线程执行(针对 v3 以上版本):

virtual void callback(const char *funcName, const std::string &data)
    {
        if (!s_cx) { return; }
        Director::getInstance()->getScheduler()->performFunctionInCocosThread([=](){
        
        // 
        // THE CALLBACK CODE
        //
            
        }); // performFunctionInCocosThread
    }

再次结论

  • 不要在非主线程中访问 spidermonkey 的资源,不然,你会死的很惨
  • 一定要多观察 XCode

你可能感兴趣的:(记一次:JS: :0:too much recursion)