【问题标题】:Strange behaviour coding with events带有事件的奇怪行为编码
【发布时间】:2015-07-08 16:46:08
【问题描述】:

因此,目前正在开发一个执行大量数据库工作的应用程序,并认为解决此问题的一种聪明方法应该是使用事件。所以我设置了一个事件发射器供应用程序使用,然后用它作为控制流程的一种方式。而且我有点假设事件发射器的工作方式类似于消息队列或类似的东西。

情况并非如此,由于某种原因,在第二次调用同一函数时,我无法让偶数发射器按预期工作。

如果问题是它被多次调用,我会理解的,但事实上,下面的代码将运行第二个函数两次,但只会通过一次dbEvents.once('Ready'。而且我不仅不知道为什么,它似乎一直这样工作,并且永远不会打印出“Wrote Fourth”

var mongo = require('mongodb');
var events = require('events');
var dbEvents = new events.EventEmitter();




function writeStuff(first, second, status, cuID){
        console.log('Wrote '+ first);
        if (status === 1) {
            console.log('\t\tReady for '+ cuID);
            dbEvents.emit('Ready');
        } else {
            console.log('\t\tReady (but not 1) for ' + cuID);
            dbEvents.emit('Ready');
        }
        console.log('\t\tjust about to kick of number ' + status);
        dbEvents.once('Ready', function (condata) {
            console.log('Wrote '+ second)
            dbEvents.emit('Done'+cuID)

        });

}

var cuID1 = mongo.ObjectID();
writeStuff('First', 'Second', 1, cuID1);
dbEvents.on('Done'+cuID1, function(){
    console.log('\tFirst completed ' + cuID1);
});

var cuID2 = mongo.ObjectID();
writeStuff('Third', 'Forth', 2, cuID2);

dbEvents.on('Done'+cuID2, function(){
    console.log("\tSecond completed " + cuID2)
});

var b = 0;
for(var i = 0; i < 100000000; i++){
    b++;
}
console.log("And I counted to " + b);

我运行上面代码时的输出是这样的

Wrote First
                Ready for 5540c57cd8fa9555076f9aba
                just about to kick of number 1
Wrote Third
                Ready (but not 1) for 5540c57cd8fa9555076f9abb
Wrote Second
        First completed 5540c57cd8fa9555076f9aba
                just about to kick of number 2
And I counted to 100000000

================ 更新==============

为什么我不能生成事件,I.E.如果我使用唯一标识符,我似乎无法将其作为事件发送。在这种情况下,我将事件更改为 Ready+cuID (mongodb),现在第二次写入永远不会被调用。

var mongo = require('mongodb');
var events = require('events');
var dbEvents = new events.EventEmitter();




function writeStuff(first, second, status, cuID){
        console.log('Wrote '+ first);
        if (status === 1) {
            console.log('\t\tReady for '+ cuID);
            var flag = 'Ready'+cuID
            dbEvents.emit(flag);
        } else {
            console.log('\t\tReady (but not 1) for ' + cuID);
            dbEvents.emit('Ready');
        }
        console.log('\t\tjust about to kick of number ' + status);
        dbEvents.once(flag, function (condata) {
            console.log('Wrote '+ second)
            dbEvents.emit('Done'+cuID)

        });

}

var cuID1 = mongo.ObjectID();
writeStuff('First', 'Second', 1, cuID1);
dbEvents.on('Done'+cuID1, function(){
    console.log('\tFirst completed ' + cuID1);
});

var cuID2 = mongo.ObjectID();
writeStuff('Third', 'Forth', 2, cuID2);

dbEvents.on('Done'+cuID2, function(){
    console.log("\tSecond completed " + cuID2)
});

var b = 0;
for(var i = 0; i < 1000000000; i++){
    b++;
}
console.log("And I counted to " + b);

【问题讨论】:

    标签: node.js javascript-events


    【解决方案1】:

    您似乎在第一次运行时调度了“Ready”事件之后添加了“Ready”侦听器。现在,当您触发第二次运行时,将调用第一个侦听器。这解释了为什么在调用“Wrote Third”之后会记录“Wrote Second”。

    将监听器的添加移动到 writeStuff() 的开头。

    function writeStuff(first, second, status, cuID){
    
        console.log('\t\tjust about to kick of number ' + status);
        dbEvents.once('Ready', function (condata) {
            console.log('Wrote '+ second)
            dbEvents.emit('Done'+cuID)
    
        });
    
        console.log('Wrote '+ first);
        if (status === 1) {
            console.log('\t\tReady for '+ cuID);
            dbEvents.emit('Ready');
        } else {
            console.log('\t\tReady (but not 1) for ' + cuID);
            dbEvents.emit('Ready');
        }
    
    }
    

    【讨论】:

    • 非常感谢江户。这确实解决了这个问题,但没有帮助我解决按顺序调用函数的更大问题,但我仍然遇到第一次调用执行两个步骤的问题,第二次迭代只调用第一个。
    • 嘿伙计,我没有看到您在更新的代码示例中试图实现的目标。有几个问题:1)您似乎在调度“标志”事件后将侦听器添加到“标志”(请参阅​​此答案)。 2)最后你想用循环实现什么?似乎您可能不明白所有这些代码都将同步运行,这就是为什么如果在您调度事件之后添加侦听器,则不会调用您的侦听器。
    猜你喜欢
    • 2011-12-04
    • 2011-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多