2015-09-02 20 views
0

可以說我有一個對象定義stream的_write屬性。可以多次寫入正確的方式

logfile是一個實際的文件。

wStream = require("stream").Writable 

,我定義:

logStream = function logStream() { 
        this.file = logfile; 
        wStream.call(this); 
       }; 

    require("util").inherits(logStream, wStream); 
    logStream.prototype._write = function logStream_write (data, enc, cb) { 
     fs.appendFile(this.file, data, 'utf-8', function WatchLogErr(err) { 
      if (err) {throw Error(err);} 
     });}; 

const log = new logStream(); 

log.on('finish', function() { 
     console.log("finished writing to log stream"); 
    }); 

如果我寫

log.write("watching changes\n"); 
log.write("watching changes\n"); 

它只寫一次,然後不寫。

爲什麼?它是否過早結束? 我怎樣才能讓它不寫結束?

UPDATE

如果說我通過認證機構的功能,FN(參數,CB){//做一些事情; CB(X);};然後我可以在發射fn時定義:fn([1,2,3],shifoo(x){console.log(x);}); 是否正確?

那麼我在哪裏使用這個cb? 說

log.write("watching changes2\n", 'utf-8', function (data) { 
     console.log("wrote " + data.toString()); 
    }); 

這樣做,讓我這個錯誤:

Error: Uncaught, unspecified "error" event. 
    at Error (native) 
    at logStream.emit (events.js:87:13) 
    at onwriteError (_stream_writable.js:317:10) 
    at onwrite (_stream_writable.js:335:5) 
    at WritableState.onwrite (_stream_writable.js:105:5) 
+1

您是否缺少另一個'});'在您的'const log = new logStream();'之前?否則,它看起來像在'_write()'方法內實例化一個'logStream'。 – mscdex

+0

修正了:) @mscdex – user2290820

回答

1

你不是叫你cb()回調appendFile()內。這需要用信號通知您已完成data,並且下一個塊可以傳遞到_write()。例如:

logStream.prototype._write = function logStream_write (data, enc, cb) { 
    fs.appendFile(this.file, data, 'utf-8', cb); 
}); 
+0

我怎麼能從外面使用這個cb?你能給我一個例如嗎? – user2290820

+1

好吧,如果你真的需要這樣做,你可以將回調存儲在實例的某個地方,比如'this._writeCb = cb;'。但是一旦你調用了回調函數,一定要清除該屬性(例如設置爲null)以避免任何潛在的問題。 – mscdex

+0

如果我說一個cb傳遞給函數,fn(args,cb){//做某件事; CB(X);};然後我可以在發射fn時定義:fn([1,2,3],shifoo(x){console.log(x);}); 是否正確? 那麼我在哪裏使用這個cb? 說 log.write(「watching changes2 \ n」,'utf-8',function(data){ console.log(「writes」+ data.toString()); }); – user2290820

相關問題