Nodejs非阻塞和事件发射器。刷新网址

时间:2015-08-06 10:10:00

标签: javascript node.js express

如果以下是非阻塞问题,那么我是不是真的不知道什么?

我开始使用https://github.com/sahat/hackathon-starter

目前我尝试从文件夹中读取所有文件,然后处理所有文件......

我使用EventEmitter来管理工作流程。

我想清除所有数组,如果URL被刷新或加载新的,但不知何故,如果我重新加载URL,那么数组中的某些内容似乎存在相同数据的多个输出?

目前我很乐意拥有正确的console.log输出。

/**
 * GET /
 * Home page.
 */
var fs = require('fs');
//XML
var jsxml = require("node-jsxml");
var Namespace = jsxml.Namespace,
    QName = jsxml.QName,
    XML = jsxml.XML,
    XMLList = jsxml.XMLList;

//EventEmitter    
var EventEmitter=require('events').EventEmitter;
var dateinamenEE=new EventEmitter();
var dateiinhaltEE=new EventEmitter();
var dateinamen = [];
var dateiinhalt = [];


exports.index = function(req, res) {
    fs.readdir('./data', function (err, files) { 
        if (!err) {
            files.forEach(function(value) {
                dateinamen.push(value);
            });
            dateinamenEE.emit('dateinamen_ready');
        } else {
            throw err; 
        }
    });

    dateinamenEE.on('dateinamen_ready',function(){
        dateinamen.forEach(function(value) {
            var buf = fs.readFileSync('./data/'+value, "utf8");
            var xml = new XML(buf);
            var list = xml.descendants("suggestion");
            var ergebnis = "";
            var basiswort = "";
            var buchstabe = "";
            var obj = null; 
            list.each(function(item, index){
                ergebnis = item.attribute('data').toString()
                //basiswort = value.replace("%2B", " ");
                //basiswort = basiswort.replace(".xml", "");
                //var pieces = buchstabe.split(" ");


                obj = {k: basiswort, b: buchstabe, e: ergebnis};
                dateiinhalt.push(obj);
            });
        });
        dateiinhaltEE.emit('dateiinhalt_ready');
    });

    dateiinhaltEE.on('dateiinhalt_ready',function(){
        //console.log(dateiinhalt);
        console.log("dateinamen:" + dateinamen.length);
        console.log("dateiinhalt:" + dateiinhalt.length);
    });

    res.render('home', {
        title: 'Home'
    });
};

如果记录2个数组的长度,则显示第二次重新加载时的输出。第一次加载网址:

Express server listening on port 3000 in development mode
dateinamen:2
dateiinhalt:20

第二次/刷新网址:

GET / 200 898.198 ms - -
GET /fonts/fontawesome-webfont.woff2?v=4.3.0 304 12.991 ms - -
GET /favicon.ico 200 4.516 ms - -
dateinamen:4
dateiinhalt:60
dateinamen:4
dateiinhalt:60
dateinamen:4
dateiinhalt:100
dateinamen:4
dateiinhalt:100
GET / 200 139.259 ms - -

是什么原因导致代码在重新加载页面时扩展数组?

1 个答案:

答案 0 :(得分:0)

非阻塞问题是由于您的for(...)循环造成的。 通过以下方式更改它们:array.forEach(function(elem, index){});

修改

阵列应该在里面初始化index function

exports.index = function(req, res) {
    var dateinamen = [];
    var dateiinhalt = [];
...

另外,我不确定您是否需要使用EventEmitter。 像

这样的东西

`

fs.readdir('./data', function (err, files) {
    if (!err) {
        files.forEach(function(file){
            var buf = fs.readFileSync('./data/'+file, "utf8");
            var xml = new XML(buf);
            var list = xml.descendants("suggestion");
            var ergebnis = null;
            var obj = null;
            list.each(function(item, index){
                ergebnis = item.attribute('data').toString();
                obj = {k: file,    v: ergebnis};
                dateiinhalt.push(obj);
            });
        });
        console.log(dateiinhalt);
    } else {
        throw err;
    }
});

` 可以做不到的工作?

(我想将此作为评论,但我仍然缺少声誉)