iOS端RN v0.7x中catch含return时JS控制台输出异常问题
React Native v0.7x iOS环境下try/catch/finally控制台输出异常问题解析
环境:iOS系统,React Native v0.7x(v0.6x无此问题)
问题现象
以下代码执行后,finally块中的console.log输出的是error而非预期的[1]:
const loading = [1]; console.log('====before catch', loading); try { await Promise.reject(new Error('error')); } catch (e) { return false; } finally { console.log('====finally', loading); }
但以下两段代码的控制台输出均正常(finally块打印出[1]):
代码1:
const loading = [1]; try { await Promise.reject(new Error('error')); } catch (e) { return false; } finally { console.log('====finally', loading); }
代码2:
const loading = [1]; try { await Promise.reject(new Error('error')); } catch (e) { // return false; } finally { console.log('====finally', loading); }
原因分析
这是React Native v0.7x针对iOS平台的控制台输出渲染bug:
- 当在
async函数的catch块中执行return语句时,控制台的变量追踪逻辑出现异常,会将finally块中打印的变量错误替换为catch捕获的异常对象。 - 第一段代码中,
catch前的console.log触发了控制台对loading变量的追踪,后续catch块的return语句触发了bug,导致finally中打印的loading被异常对象覆盖。 - 第二段代码去掉了
catch前的console.log,控制台未对loading进行追踪,因此未触发bug。 - 第三段代码注释掉了
catch块中的return语句,不满足bug的触发条件,所以输出正常。
内容的提问来源于stack exchange,提问作者Ren Yongjun
相关产品推荐
相关产品推荐

