gpt4 book ai didi

javascript - stringByEvaluatingJavaScriptFromString 如何重入?

转载 作者:行者123 更新时间:2023-11-29 12:21:33 26 4
gpt4 key购买 nike

我正在 iOS 上构建混合原生/HTML5 应用程序。作为 native /HTML5 桥的一部分,我正在通过 stringByEvaluatingJavaScriptFromString 执行一些 JavaScript 代码.

我确保从 native 端的主调度队列调用此函数。大多数情况下,对 JavaScript 端的影响是被调用的 JavaScript 代码直接从(JavaScript 堆栈的)顶层调用,即使对 stringByEvaluatingJavaScriptFromString 的多次调用非常接近。

然而,偶尔,我看到有证据表明在方法执行过程中发生了对 stringByEvaluatingJavaScriptFromString 的调用 - 也就是说,例如调用的方法在 stringByEvaluatingJavaScriptFromString 调用的方法开始执行之前,事件处理程序不会返回。

鉴于 JavaScript 是单线程的,这怎么可能?

最佳答案

这个问题困扰了我几个月,我终于有了答案的证据。

虽然 iOS 通常在 JavaScript 堆栈的顶部执行 stringByEvaluatingJavaScriptFromString 调用,但某些系统调用似乎“屈服于”待处理的评估。我特别指出的一个是 XmlHttpRequest.send():如果在调用 send() 时碰巧有未决的评估,send() 将阻塞直到这些评估被执行。可能还有其他人。

如果这种行为是不可取的,您可以通过将 stringByEvaluatingJavaScriptFromString 调用的函数包装在 setTimeout(..., 0) 中来避免代码重入。参见 this question有关此类调用为何有用的背景信息。

编辑:虽然我在写完这篇文章后想到 xhr.send() 会执行任何未决的评估,但不会执行未决的超时,这有点奇怪。我将不得不做更多的实验...

编辑 2:实验表明 xhr.send() 实际上不会执行挂起的超时。这种不一致有点奇怪,但就是这样。

关于javascript - stringByEvaluatingJavaScriptFromString 如何重入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30496369/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com