Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何确保调用是异步的?_Javascript_Node.js - Fatal编程技术网

Javascript 如何确保调用是异步的?

Javascript 如何确保调用是异步的?,javascript,node.js,Javascript,Node.js,我有一个程序,其中用户首先创建一个文件,一旦文件被创建,我会将来自客户端的数据添加到文件中。我对nodejs还不熟悉,所以我只想得到一个专家的意见,以防多个用户同时在他们的机器上创建和录制文件时,它会异步工作还是我需要对代码进行一些更改 io.js server.js userLogs: function (callback) { var filename = uuid.v4() + '.log'; var file = filePath + '/' + filename;

我有一个程序,其中用户首先创建一个文件,一旦文件被创建,我会将来自客户端的数据添加到文件中。我对nodejs还不熟悉,所以我只想得到一个专家的意见,以防多个用户同时在他们的机器上创建和录制文件时,它会异步工作还是我需要对代码进行一些更改

io.js

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);
                    }
                });
            });
}

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

您应该使用
fs。打开
并在其中回调:

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);
    });
},
您还可以使用展平
记录日志

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

最后一个提示是,
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);
        }
    });
}

这将很方便-这就是我们编写异步调用的方式此语法有大量错误不确定我是否需要所有这些=>
(params)=>{}
函数(param){}
的ES6语法。你说“这就是我们编写异步调用的方式”是什么意思?我从来没有使用过异步,这就是为什么我问这是怎么回事,但是这些参数ES6有很多语法问题,我们可以在没有新的ES^语法的情况下编写它吗?@hussain:当然,只要用
函数()
替换每个
()=>
。是的,您将看到所有异步函数都将错误作为第一个回调参数传递。语法错误可能是由于未使用严格模式,请尝试添加
“使用严格模式”位于文件顶部。通过添加函数()表示感谢。现在,当我调用recordLogs时,语法问题得到了解决。我在
函数(err,file){callback(err);}行上看到错误
回调未定义
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);
        }
    });
}