2014-02-14 28 views
2

我是新來的node.js,所以忍受着我。我需要一個返回文件行長度的函數。 我希望能像做nodejs文件行數返回undefined

file1 = line_length_func('file'); 
file2 = line_length_function('file'); 
if (file1 === file2) { console.log('same number of lines!');} 

我一直在尋找到各種各樣的方式來做到這一點,與child.exec(貓文件| WC-1),但產卵子實例變得有點複雜。我不知道如何將變量從我的孩子傳遞給父母或如果是這樣做的好做法...

所以我試了這個 - 我看到fs.open返回的行數:

function get_lines(file) { 
    var lines = fs.open(file, 'r', function(err, fd) { 
     var lines = fd; 
    }); 
} 

a = get_lines('file.txt'); 
console.log(a); 

但我只是一直未定義。

我想接下來的事情是:(感謝Andrey Sidorov's post

function get_line_count(file) { 
    var count = 0; 
    fs.createReadStream(file) 
     .on('data', function(chunk) { 
      for (var i = 0; i < chunk.length; i++) 
       if (chunk[i] == 10) count++; 
     }) 
     .on('end', function() { 
      return count; 
     }); 
} 

var file1_lines = get_line_count('test.txt'); 
console.log(file1_lines); 

,但我得到了相同的結果。未定義。

我不習慣節點,所以任何幫助將是美好的!謝謝!

更新

行數似乎是現在的工作,但我還是不能寫比較這兩個功能。

function get_line_count(file, cb) { 
    var count = 0; 
    fs.createReadStream(file) 
     .on('data', function(chunk) { 
      for (var i = 0; i < chunk.length; i++) 
       if (chunk[i] == 10) count++; 
     }) 
     .on('end', function() { 
      cb(null, count); 
     }) 
     .once('error', cb); 
} 

var file1 = get_line_count('test.txt', function(err, lines) { 
    if (err) return; // todo 
    return lines; 
}); 

var file2 = get_line_count('test2.txt', function(err, lines) { 
    if (err) return; //todo 
    return lines; 
}); 

function same_line_length(len1, len2) { 
    return len1===len2; 
} 

console.log(same_line_length(file1, file2)); 

這總是返回true ...

+1

你應該在回調/異步執行讀了起來:HTTP://堆棧溢出。com/a/4506306/3263412 – marionebl

+0

嗯,我不習慣它是如何工作的。感謝您的鏈接,我會在嘗試解決這個問題時檢查一下。任何建議我的功能?我錯過了什麼? – Ptrkcon

回答

2

甚至在文件讀取操作之前,您的「get_line_count」也是完整的開始。這是異步IO,如果這可以幫助考慮命名你的函數「start_file_linecount_sequence(name,oncomplete)」 - 該函數將一些請求放入隊列並退出(幾乎立即),並且稍後在某個時間點從事件循環中調用你的處理程序。

function get_line_count(file, cb) { 
    var count = 0; 
    fs.createReadStream(file) 
     .on('data', function(chunk) { 
      for (var i = 0; i < chunk.length; i++) 
       if (chunk[i] == 10) count++; 
     }) 
     .on('end', function() { 
      cb(null, count) 
     }) 
     .once('error', cb); 
} 

get_line_count('test.txt', console.log); 
+0

我以前沒有用過.once(event,listener)。它將來自fs.readstream的任何錯誤傳遞給我的函數? – Ptrkcon

+0

只能調用一次參數(回調) - 這種方式只報告第一個錯誤。 「錯誤」事件的慣例是具有一個單一參數,通常爲js錯誤對象 –

+0

「錯誤」總是隻有單一參數?只是好奇未來的參考。 – Ptrkcon

1

在功能get_line_count(file)return count是匿名函數( '結束' 事件處理程序),而不是get_line_count()。所以調用get_line_count()將返回undefined。

假設你有一個需要知道行數的函數:

function doSomething(count) { 
    //your code 
} 

變化get_line_count的定義:

function get_line_count(file, cb) { 
    var count = 0; 
    fs.createReadStream(file) 
    .on('data', function(chunk) { 
     for (var i = 0; i < chunk.length; i++) 
      if (chunk[i] == 10) count++; 
    }) 
    .on('end', function() { 
     // return count; 
     cb(count); 
    }); 
} 

最後,調用get_line_count()這樣的:

get_line_count(file, doSomething); 
+0

如何返回函數作用域中的count變量? – Ptrkcon

+0

@Ptrkcon唯一的方法是'fs.readFileSync',但不建議同步I/O,因爲這會阻塞當前線程。 – CodeColorist

+0

見安德烈西多羅夫的答案。最好將錯誤參數添加到回調函數中。 – bnuhero

1

兩個函數,你試着用異步核心方法的工作:fs.createReadStreamfs.open。從這些功能讓你的結果,你必須傳遞一個回調,這樣的:在關閉和回調

function getLineCount(file, cb) { 
    var count = 0; 

    fs.createReadStream(file) 
     .on('data', function(chunk) { 
     for (var i = 0; i < chunk.length; i++) 
     if (chunk[i] == 10) count++; 
     }) 
     .once('error', cb) 
     .on('end', function() { 
     cb(null, count); 
     }); 
} 


getLineCount('example.txt', function(err, count) { 
    if (err) return err; // do something about the error 
    console.log(count); 
}); 

的更多信息:What are Closures and Callbacks?

+1

fs.open在回調中返回文件描述符,而不是文件內容。另外cb是第三個參數(第二個是'模式',例如'r') –

+0

你是對的。在那之前沒有進行過測試的地方跟隨着那個。更新爲使用'fs.createReadStream',但我看到你發佈了第一個@AndreySidorov。 – marionebl