2013-07-08 18 views
0

我正在做一個函數來檢查兩個文件是否包含給定的字符串。如果這兩個文件不包含字符串,它應該返回未定義:( 這裏是我的代碼:檢查兩個文件是否包含給定的字符串 - 函數錯誤

var fs = require("fs"); 

function get_uniq(string, file1, file2, callback){ 
    fs.readFile(file1, 'utf8', function(err, data1) { 
    if (err) throw err; 

    i = data1.search(string); 
    console.log(i); 
    if(i == -1){ 
     fs.readFile(file2, 'utf8', function(err, data2) { 
     if (err) throw err; 

     j = data2.search(string); 
     if(j == -1){ 
      return 1; 
     } 
     }); 

    } 
}); 
    callback(); 
} 
var i = get_uniq("stringThatFilesDoesntContainin", "somefile.txt", "anotherfile.txt", function(){ 

console.log(i); 

}); 

任何想法是什麼問題

回答

2

你不應該依賴返回一個計算值?在節點的功能可以異步執行的,因此它可以返回之前功能就可以完成。爲了當函數完成回調給予執行。對於如

fs.readFile(file1, 'utf8', function(err, data1) {...}); 

傳遞作爲最後一個參數是回調函數。它執行了wh該文件已被讀取。嘗試返回數據將導致未定義的值。

在你的情況下,對於所有情況,返回的值將是未定義的。回調將與readFile並行執行。

回調必須從readFile中調用file1或file2,無論它在哪裏都可以邏輯完成。爲了給在那裏可以添加回調的所有地方都:

function get_uniq(string, file1, file2, callback){ 
    fs.readFile(file1, 'utf8', function(err, data1) { 
    if (err) 
    { 
     throw err; 
     callback(err); 
    } 
    else 
    { 
     i = data1.search(string); 
     console.log(i); 
     if(i == -1){ 
     fs.readFile(file2, 'utf8', function(err, data2) { 
      if (err) 
      { 
      throw err; 
      callback(err); 
      } 
      else 
      { 
      j = data2.search(string); 
      if(j == -1){ 
       callback(false); 
      } 
      else 
      callback(true); 
      } 
     }); 
     } 
     else 
     callback(false); 
    } 
    }); 
} 

你可以把你的回調參數返回值(真/假)。或從內部捕捉錯誤。你將如何執行上述功能將是這樣的:

get_uniq("stringThatFilesDoesntContainin", "somefile.txt", "anotherfile.txt", function(value){ 
    console.log(value); 
}); 
+1

爲了使這更地道我會刪除「扔ERR」線,並且只使用回調(ERR)來代替。另外,我會使用callback(null,true)和callback(null,false)分別以true/false結尾。 –

+0

工作得很好。謝謝... – user2316602

相關問題