0

我正在制作一个函数来检查两个文件是否包含给定的字符串。如果两个文件都不包含字符串,它应该返回 undefined :( 这是我的代码:

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

});

知道问题是什么吗?

4

1 回答 1

2

您不应依赖返回计算值。在节点中,函数可以异步执行,因此它可以在函数完成之前返回。当函数完成回调时执行。例如

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

作为最后一个参数传递的函数是回调。它在文件被读取时执行。尝试返回数据将导致未定义的值。

在您的情况下,所有情况下的返回值都是未定义的。回调将与 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);
}); 
于 2013-07-08T19:32:51.840 回答