簡體   English   中英

nodejs頻繁寫入文件

[英]nodejs write file frequently

我有一個監聽器來監聽內容的更改,一旦內容被修改,它將發出處理程序函數:

$('#editor').on('onchange', () => changeHandler('...','...'));

function changeHandler(filePath, content){
    var ws = fs.createWriteStream(filePath, 'utf8');
    ws.write(content);
}

我的問題是,“更改”發生的頻率很高,因此“寫入文件”的處理頻率很高,在此期間它可能會丟失數據。 有人可以提出任何建議嗎?

立即更新根據以下答案,我更改了代碼:

this.buffer = null; //used to cache

// once content changed, maybe too often
changeHandler() {        
    if (this.editor.curOp && this.editor.curOp.command.name) {
        var id = $('.nav-items li.active .lk-hosts').attr('data-hosts-id');
        var content = this.editor.getValue();
        // cache data, not immediately write to file
        this.buffer = {id: id, content: content};
    }        
}

setInterval(()=> {
        // means there's data in cache
        if (this.buffer !== null) {
            let id = this.buffer.id;
            let content = this.buffer.content;
            // reset cache to null
            this.buffer = null;
            // write file
            this.writeContent(id, content, (err)=> {
            })
        }
    }, 800);

感謝所有答案!

以下示例顯示了如何進行去抖動事件處理,盡管它不是node.js代碼,但概念上是相同的。

 // eventEmitter variable to use var emitter = new EventEmitter(); // dom element change event $('#editor').on('input', function(event) { emitter.emit('changeEvent', event.target.value); }); // event listener, which debounces change event of input emitter.on('changeEvent', debounce(function(data) { writeFile('li', data); }, 1000)); // <== debounce for 1second // sample emitter, for demo // we don't have access to nodejs EventEmitter class in Stackoverflow // don't use in production function EventEmitter() { var callbacks = []; return { on: function(eventName, fn) { callbacks.push({ eventName: eventName, callback: fn }) }, emit: function(eventName, payload) { var fn = callbacks.find(function(item) { return item.eventName === eventName; }); if (fn) { fn.callback(payload); } } } } // simple logger for demo purpose // emulates write file function writeFile(name, content) { var $elem = $(document.createElement(name)); $elem.text(content); $('#logger').append($elem); } // throttle function - reduces fn call with timeout // credits: https://remysharp.com/2010/07/21/throttling-function-calls function debounce(fn, delay) { var timer = null; return function() { var context = this, args = arguments; clearTimeout(timer); timer = setTimeout(function() { fn.apply(context, args); }, delay); }; } 
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <textarea id="editor" placeholder="Enter text, this will emit change event"></textarea> <p> Notice the 1sec throttle (write something, pause for 1sec, write again) </p> <ul id="logger"></ul> 

反跳功能也可以用於文本區域更改事件

// debounce emitting
$('#editor').on('input', debounce(function(event) {
  emitter.emit('changeEvent', event.target.value);
}, 1000));

// write file when received event without debounce
emitter.on('changeEvent', function(data){
  logElement('li', data);
});

為什么不簡單地建立一個緩沖區來收集書面文本,然后僅在具有一定寫入次數時才寫入文件:

$('#editor').on('onchange', () => changeHandler('...','...'));

var writeBuffer = ''; // can also make this an array
var writeBufferSize = 0;
var filePath = 'path_to_file';
var ws = fs.createWriteStream(filePath, 'utf8');

function changeHandler(content){
    if (writeBufferSize == SOME_THRESHOLD) {
        ws.write(writeBuffer);
        writeBuffer = '';
        writeBufferSize = 0;
    } else {
        writeBuffer += content + '\n';
        writeBufferSize++;
    }
}

如果選擇的寫緩沖區閾值太大,則可能需要將寫委托給某個工作線程以並行完成,在這種情況下,您可以創建另一個臨時寫緩沖區以在寫入原始對象時填充它,然后切換兩個。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM