【问题标题】:React Native code doesn't work without Remote Debugger enabled如果没有启用远程调试器,React Native 代码将无法工作
【发布时间】:2017-06-11 23:54:15
【问题描述】:

这是一个奇怪的问题,但由于我对此非常好奇,所以我想问一下。当我启用远程调试时,我有一段代码可以在 iOS 模拟器中运行,但如果没有它,它就会停止工作。这是代码:

      let filtered = []
      let dueDate
      const dateNow = new Date(Date.now())

      for (let item of this.props.listData) {
        dueDate = new Date(item.dueDate)
        if (!item.paid && (dueDate < dateNow)) {
          filtered.push(item)
        }
      }
      if (filtered.length > 0) {          
        this.setState({
          dataSource: this.state.dataSource.cloneWithRows(filtered)
        })
      }

(item.dueDate 是一个类似“12.02.2016”的字符串)

如果我以正确的格式(如 ISO“2016-02-12”)提供日期,显然该代码将有效(并且有效)。我感兴趣的是,为什么当我启用远程调试(启动 Google Chrome 实例)时,即使格式错误,它也能正常工作?因为当我 console.log Chrome 中的日期时,它们会正常转换。提前致谢!

【问题讨论】:

  • 它究竟是如何停止工作的?
  • 过滤器仅在启用调试器的情况下工作,因此很难精确调试它发生的位置,但我确定这是因为日期格式 - 当我将其更改为 ISO 时,它可以工作现在(如果我在 JavaScript REPL 中尝试使用错误的格式,它也不会工作)。

标签: react-native ios-simulator


【解决方案1】:

这很可能是由于设备上的 JavaScript 执行环境与远程调试器中的细微差别所致。

在这种情况下,Date 构造函数似乎在 Chrome 远程调试环境中接受特定于语言环境的日期格式,但在设备上不接受。这可能是由于您的计算机的区域设置已设置为使用dd.MM.yyyy 格式的文化,而模拟器设置为其他格式,例如en-US。 ISO 格式适用于两者,因为无论语言环境如何都支持它。

当您在设备或模拟器上运行代码时,代码会在设备本身的JavaScriptCore 中执行。这是 React Native 内部用于运行应用程序脚本的 JavaScript 引擎

当您打开远程调试时,React Native 打包程序将改为执行您计算机的 Chrome 的 JavaScript 引擎 V8 中的代码,并通过 WebSockets 在浏览器和设备/模拟器之间发送消息。

您遇到了使 React Native 中的远程调试不可靠的众多边缘情况之一。您应该始终在没有调试器的情况下在真实设备上测试所有功能。

【讨论】:

  • 非常感谢您的回答,我怀疑会发生这样的事情。在设备上进行测试是对的。
  • @kuhaku 我建议再问一个问题将充分解释您面临的问题 - cmets 不是提供帮助的好地方
  • @jevakallio 你能解决它吗?我有同样的问题。只有在调试模式下才有效。这是我的代码pastebin.com/JRDFLTQg
  • 我遇到的一个问题是一些无效的 console.log 语句在远程调试器中运行良好。这最终冻结了整个应用程序,非常难以调试!
  • @Par 提示帮助我解决了这个问题。检查代码中的 console.logs。
【解决方案2】:

我在使用调试模式 moment.js 修复了我的问题时遇到了同样的问题,

【讨论】:

    【解决方案3】:

    一开始我也遇到了同样的问题,我认为设备内部可能有问题。进一步深入研究,我发现它与new Date() 库有关。

    我用下面的代码解决了这个问题:

      convDate(dateStr) {
        // From mm-dd-yyyy to yyyy-mm-ddThh:MM:ssZ
        var dArr = dateStr.split("-");
        return dArr[2] + "-" + dArr[0] + "-" + dArr[1] + "T00:00:00"; //2017-09-13T00:13:28
      }  
    

    我这样调用方法:

    const check = new Date(this.convDate(givenDate));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-07
      • 1970-01-01
      • 2022-10-16
      • 2016-06-28
      • 2016-11-23
      • 2017-10-09
      • 2018-07-31
      • 2021-12-09
      相关资源
      最近更新 更多