首页 > 技术文章 > 对事件循环的一点理解

zhaowinter 2017-12-01 11:53 原文

最近工作需要学习了解webworker-threads以应对Javascript多线程处理CPU密集型的可能性;参考文档JavaScript多线程之二 Node.js中的Web Worker;

以下是自己的一次尝试并引发的对于Javascript事件循环机制的一点理解

        var Worker = require('webworker-threads').Worker; 

        var worker = new Worker(function() { 
            console.log(33333) 
            postMessage('hello, I\'m send before message'); 
            this.onmessage = function(event) { 
                console.log(22222); 
                postMessage('Hello, I\'m listening'); 
                console.log(event.data); 
            } 
        }) 

        worker.onmessage = function(event) { 
            console.log(11111) 
            console.log(event.data); 
        } 
        console.log(4444); 
        worker.postMessage('hello'); 

输出结果为: 

4444 
33333 
22222 
hello 
11111 
hello, I'm send before message 
11111 
Hello, I'm listening 

那么思考一下这个结果是如何产生的?

首先,确定Javascript是单线程事件循环机制,整体执行顺序如下:

  1. 第一次主线程运行: 输出 4444; 向we bworker发送信息’hello’;
  2. 事件循环第一次: 主线程发送的hello触发子线程: 输出 333333 -> 发送 ‘hello, I\’m send before message’ -> 输出 22222 -> 发送 ‘Hello, I\’m listening’ -> 输出hello;
  3. 事件循环第二次: 输出11111 -> 输出: ‘hello, I\’m send before message’;
  4. 事件循环第三次: 输出11111; 输出: ‘Hello, I\’m listening’

总结: 当前发送的事件触发信号会在下一次事件循环时触发.

推荐阅读