如何确保调用是异步的?

时间:2016-08-02 13:52:08

标签: javascript node.js

我有一个程序,用户在创建文件后首先创建文件我将数据附加到来自客户端的文件中。下面的代码按预期工作。我是nodejs的新手所以只是想在多个用户同时在他们的机器上创建和记录文件的情况下得到专家意见,它会异步工作还是我需要对代码进行一些更改?

io.js

socket.on('createlogfile', function() {
            logsRecording.userLogs(function(filename) {
                socket.emit('filename', filename);
            });

        });
        socket.on('startrecording', function(obj) {
            logsRecording.recordLogs(obj);
        });

server.js

userLogs: function (callback) {
    var filename = uuid.v4() + '.log';
    var file = filePath + '/' + filename;
    fs.openSync(file, 'a',function () {
        console.log('file created');
    });
    console.log('userLogs');
    callback(filename);
},

recordLogs: function (obj) {
    var dir = './app/records/templogs'
    var fileAppend = dir + '/'+ obj.file;
    console.log('data from recording', obj.data);
            fs.readdir(dir, function(err, items) {
                items.forEach(function(file){
                    if(obj.file === file){
                        fs.appendFile(fileAppend, obj.data+ "\r\n", null, 'utf8', function (err) {
                            if (err) throw err;
                        });
                        console.log('filename in records',obj.file);
                    }
                });
            });
}

1 个答案:

答案 0 :(得分:0)

您正在使用fs.openSync,这是同步的,因此可以挂起事件循环。

您应该使用fs.open并在其中回调:

userLogs: function (callback) {
    var filename = uuid.v4() + '.log';
    var file = filePath + '/' + filename;
    fs.open(file, 'a', function (err) {
        console.log('file created');
            console.log('userLogs');
            callback(err, filename);
    });
},

您可以使用async展平recordLogs

另外,在同步函数中抛出错误是不好的做法,你应该在回调中传递错误。

作为最后一个提示,Array.forEach是同步的,可以挂起流程,您应该使用async.each

recordLogs: function (obj, callback) {
    var dir = './app/records/templogs'
    var fileAppend = dir + '/'+ obj.file;
    console.log('data from recording', obj.data);
    async.waterfall([
        (callback) => {
            fs.readdir(dir, (err, items) => {
                callback(err, items);
            });
        },
        (items, callback) => {
            async.each(items, (file, callback) => {
                if(obj.file === file) {
                    fs.appendFile(fileAppend, obj.data+ "\r\n", null, 'utf8', function (err) {
                        callback(err);
                    });
                    console.log('filename in records',obj.file);
                } else {
                    callback();
                }
            }, (err) => {
                callback(err);
            });
        }
    ], (err, file) => {
        if(callback) {
            callback(err);
        }
    });
}