2016-08-02 3 views
-1

У меня есть программа, в которой пользователь сначала создает файл после создания файла. Я добавляю данные в файл, который поступает от клиента последовательно. Нижеприведенный код работает как ожидалось. Я новичок в 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); 
        } 
       }); 
      }); 
} 
+2

Это будет удобно - http://caolan.github.io/async/ – deeveeABC

ответ

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

И вы можете придавить recordLogs с помощью async.

Кроме того, неверная практика заключается в том, чтобы вызывать ошибку в синхронной функции, вы должны передавать ошибку в обратном вызове.

В качестве последнего наконечника, 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); 
     } 
    }); 
} 
+0

вот как мы пишем асинхронный вызов, этот синтаксис содержит кучу ошибок, не обязательно, я все это требую => – hussain

+0

'(params) => {}' - синтаксис ES6 для 'function (param) {}'. Что вы подразумеваете под «этим, как мы пишем асинхронный вызов»? – DrakaSAN

+0

Я никогда не использовал async, поэтому я спросил, как это сделать, но эти параметры ES6 имеют много проблем с синтаксисом. Можем ли мы написать это без этого нового синтаксиса ES ^? – hussain

Смежные вопросы