Skip to content

Instantly share code, notes, and snippets.

@dailc
Created June 13, 2017 07:48
Show Gist options
  • Save dailc/1cd1c565db6c9aa494630a52f7a20057 to your computer and use it in GitHub Desktop.
Save dailc/1cd1c565db6c9aa494630a52f7a20057 to your computer and use it in GitHub Desktop.
[单线程的JavaScript] JS虽然有异步,但实质仍然是单线程,有时候容易造成困扰,这里就一些特殊情况做记录 tags:singlethread,javascript
## webview中JavaScript中的UI线程阻塞
* 如果在webview中执行逻辑,并且没有阻塞UI相关的显示(如alert,悬浮对话框等,toast不影响),这时候是可以正常执行逻辑的
* 但是如果在逻辑中加了一个alert(或其他悬浮框等会阻塞UI的显示),这时候,所有的逻辑都会被阻塞住。直到页面这个阻塞消失(如点击确认按钮),才会继续接下来的逻辑
归根结底,这个问题的关键是JS是一个单线程操作(虽然有异步,但是仍然是单线程),所以只要是阻塞UI线程操作都会阻塞所有的逻辑。
容易出现的场景:
* 先执行一个setTimeout(bizlogic1)-一个短期的演示
* 然后执行一个alert
* 然后等待很久后再点击确定
如果按照多线程理解,setTimeout会自行执行完毕。
但是由于JS的实质是单线程,所以其实从alert出现的那一刻,setTimeout等一切逻辑都被阻塞住了。
只有alert结束完毕后才会继续之前的逻辑(也就是说setTimeout在阻塞的这一段时间根本就不会动)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment