在Node.js中与单例同步问题readdir

弗洛扎

第一个使用Node.js的应用程序,试图在一个单例类中探索文件以从中获取内容,但是顺序不是我期望的。我当然不知道,您能告诉我为什么吗..

单例课程:

var Singleton = (function()
{
    var _instance = null;

    return new function()
    {
        this.Instance = function()
        {
            if (_instance == null)
            {
                _instance = new Foo();
            }
            return _instance;
        }
    };
})();

Foo类:

var Foo= function Foo()
{
    this._filesDir= "./core/files/";
    this._storedFiles = {};

    this.method1();
console.log("call constructor");
};

Foo.prototype = {
    method1: function()
    {
        console.log("call method1");
        var that = this;

        var c = 0;

        fs.readdirSync(this._filesDir).forEach(function(fileName)
        {
            console.log("iterating file"+ c);

            c++;
            fs.readFile(that._filesDir + fileName, 'utf-8', function(err, content)
            { 
                var clean_FileName = fileName.replace(".txt", "");
                console.log( clean_fileName );
                that._storedFiles[ clean_fileName ] = content;
            });
        });
    },

    method2: function( fileName )
    {
        console.log('call method2');
        return ( fileName in this._storedFiles);
    }
};

调用:

console.log( Singleton.Instance().method2("myfile") );

在目录中,只有此myfile.txt

但是,控制台向我显示:

call method1
iterating file0
call constructor
call method2
false
GET /test 304 11ms
myfile

所以我的回答是错误的,这个普通的构造函数是否在第三个位置调用?我需要类构造,存储并最终执行method2()。我在做什么不好?

坏峡谷

问题的根源是fs.readFile是异步的。在读取文件内容之前,method1返回。一个简单的解决方法是将其更改为fs.readFileSync

“调用构造函数”排在第三位的原因是因为您首先调用method1()。

this.method1();
console.log("call constructor");

method1中的所有内容都在console.log(“ call构造函数”)发生之前运行。如果您希望顺序正确,则可以简单地将两者互换。

从高层来看,使用同步调用(readdirSync,readFileSync)通常是一个坏主意,因为它们会阻止Node在运行时执行任何其他操作。我建议研究回调,控制流以及Node.js的异步特性。有很多很棒的教程。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

express / node.js中的请求之间的同步问题

来自分类Dev

express / node.js中的请求之间的同步问题

来自分类Dev

通过单例的node.js mySQL连接

来自分类Dev

需要外部输入的Node.js单例模块模式

来自分类Dev

如何使Node js同步?

来自分类Dev

Node JS 同步事件

来自分类Dev

在node.js中同步调用

来自分类Dev

同步node.js中的查询(或事件)

来自分类Dev

Node.js 中的同步块

来自分类Dev

Cassandra驱动程序(Node.js)中的同步查询执行问题

来自分类Dev

在Java中同步单例

来自分类Dev

线程同步和单例问题

来自分类Dev

线程同步和单例问题

来自分类Dev

Node.js:单例变量会被覆盖对异步请求吗?

来自分类Dev

Node.js:单例变量是否被覆盖对异步请求起作用?

来自分类Dev

Node.js WriteStream同步

来自分类Dev

Node.js同步与异步

来自分类Dev

Node.js同步循环

来自分类Dev

Node.JS 为 fs.readdir 数组中的每一项运行函数

来自分类Dev

Node js中多个连接的性能问题?

来自分类Dev

node.js 模块中的权限问题

来自分类Dev

如何在Node.js中同步读取文件内容?

来自分类Dev

如何在Node.js中同步连接到MongoDB

来自分类Dev

如何在node.js的同步函数中捕获错误?

来自分类Dev

如何从Node.js中的URL同步下载文件

来自分类Dev

Node.js中的'console.time'是同步还是异步?

来自分类Dev

在Node.js中附加多个gzip文件(同步)

来自分类Dev

从Node.js中的文件同步读取行

来自分类Dev

变量分配在Node.js中是同步的吗?