在事件处理程序中读取和写入全局variables:什么时候是并发性问题?

我是Node.JS的新手,并开始阅读关于Node.js事件处理和并发性的几个主题。

下面的代码触发1000次事件,这是通过增加一个全局variables来处理的。 代码的第一位成功地计数到1000,但第二位甚至没有增加到2.是否有我没有得到的primefaces性?

我仍然想知道为什么下面的代码提供了连贯的输出(它没有任何并发​​地成功计数到1000:

// Import events module var events = require('events'); // Event emitter var eventEmitter = new events.EventEmitter(); var max = 1000; var count = 0; eventEmitter.on('event', () => { let time = Math.trunc(Math.random() * 1000) +1; setTimeout(() => { var c = count; c++; count = c; console.log(c); }, time); }); // Fire for (let i = 0; i < max; i++) { eventEmitter.emit('event'); } console.log('Program Ended.'); 

有没有primefaces性,我没有得到?

但是,当我移动var创build和分配时,输出是完全不同的(最终结果是1)。

 // Import events module var events = require('events'); // Event emitter var eventEmitter = new events.EventEmitter(); var max = 1000; var count = 0; eventEmitter.on('event', () => { let time = Math.trunc(Math.random() * 1000) +1; var c = count; setTimeout(() => { c++; count = c; console.log(c); }, time); }); // Fire for (let i = 0; i < max; i++) { eventEmitter.emit('event'); } console.log('Program Ended.'); 

有什么build议? 任何阅读?

祝你今天愉快 !

当代码开始的时候,你甚至可以一口气发出所有的事件。 所以你on 'event'在启动程序后立即触发。 在每个事件处理程序完成后调用所有超时callback。 在您的eventcallback(不是在settimeoutcallback)中打印一个打印,并看到输出。

在第二个代码片段中,所有settimeoutcallback都捕获count = 0因为

 var c = count; 

settimeoutcallback之外,因此callback将其递增为1。

但在第一个代码片段计数是在callback内读取

 var c = count; 

所以每个callback都有更新的值。

从Bergi提供的外部资源:

所有Javascript事件处理程序脚本都是从一个主事件队列中处理的。 这意味着事件处理程序一次运行一个事件处理程序,一个事件处理程序一直运行,直到下一个准备就绪的事件开始运行。 因此,Javascript中没有竞争条件。 在JavaScript中执行任何单独的线程将在下一个开始之前运行完成。

从这个 。

和:

一个事件将在下一个事件触发前运行完成。 因此,如果在第一次点击仍在处理的同时发生第二次点击,则第二次点击将排队,直到处理完第一次的代码完成后才会运行。

从那