如果没有启用远程调试器,React Native代码将无法运行

时间:2017-01-26 13:34:33

标签: react-native ios-simulator

这是一个奇怪的问题,但由于我对此非常好奇,我想问一下。当我启用远程调试时,我有一段在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实例)时,为什么即使格式错误也能正常工作?因为当我在控制台.log中记录Chrome中的日期时,它们会正常转换。提前谢谢!

3 个答案:

答案 0 :(得分:18)

这很可能是由于设备上的JavaScript执行环境与远程调试器之间的细微差别造成的。

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

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

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

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

答案 1 :(得分:0)

起初我有同样的问题,我认为设备内可能有问题。进一步深入研究,我发现它与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));

答案 2 :(得分:0)

我在调试模式为moment.js的日期中也遇到了同样的问题,