我正在iOS上构建混合原生/ HTML5应用。作为本机/ HTML5网桥的一部分,我通过stringByEvaluatingJavaScriptFromString执行了一些JavaScript代码。
我确保从本机端的主调度队列中调用此函数。大多数情况下,对JavaScript方面的影响是调用的JavaScript代码直接从顶层(JavaScript堆栈)调用,即使多次调用stringByEvaluatingJavaScriptFromString发生在附近。
然而,偶尔,我看到证据表明在方法执行过程中发生了对stringByEvaluatingJavaScriptFromString的调用 - 也就是说,在stringByEvaluatingJavaScriptFromString调用的方法开始执行之前,事件处理程序不会返回。
鉴于JavaScript是单线程的,这怎么可能?
答案 0 :(得分:1)
这个问题困扰了我好几个月,我终于得到了答案的证据。
虽然iOS通常在JavaScript堆栈的顶部执行stringByEvaluatingJavaScriptFromString调用,但某些系统调用似乎“屈服”到待处理的评估。我特别指出的是XmlHttpRequest.send():如果在调用send()时恰好有待定的评估,send()将阻塞,直到执行这些评估。也可能有其他人。
如果不希望出现这种情况,可以通过在setTimeout(...,0)中包装stringByEvaluatingJavaScriptFromString调用的函数来避免代码重新出现。有关此类调用有用的原因的背景信息,请参阅this question。
编辑:虽然在写完之后发生了这种情况,但是xhr.send()将执行任何挂起的评估有点奇怪,但是不会执行挂起的超时。我将不得不做更多的实验......
编辑2:实验表明xhr.send()实际上并不执行挂起的超时。不一致有点奇怪,但你有它。