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