2016-07-24 15 views
0

NodeとCommanderを使用して短いスクリプトを作成しています。指定されたファイルの最後の数行を表示します。私はノードで非同期ファイルの読み込みを使用しようとしていますが、コールバックを設定するのにひどい問題があります。コールバックのコードは、親関数の前に実行されているようです。それも可能ですか?ここでJavascriptコールバックが親関数の前に呼び出される

はスクリプトです:

#!/usr/bin/env node 

const readline = require('readline'); 
const fs = require('fs'); 
const program = require('commander'); 
const chalk = require('chalk'); 

var consoleArguments = process.argv; 

var fileValue =''; 
var linesArray = []; 

var main = function() { 

} 

function readFile(fileValue, callback){ 
    fs.readFile(fileValue, function(err, data) { 
     console.log("Hello from fs.readFile callback! \nReading file: " + fileValue); 
     var i = 0; 
     if(err) throw err; 
     linesArray = data.toString().split("\n"); 
     console.log("Hello from fs.readFile callback! Have just read the contents of file.\nThere are " + linesArray.length + " lines in the file!"); 
     for(i = 0; i <= linesArray.length - 1; i++) { 
      //console.log(i +": " + linesArray[i]); 
     } 
     console.log("Returned linesArray from fs.readFile callback!"); 
     return linesArray; 
    }); 
    console.log("Type of callback: " + typeof(callback)); 
    if (typeof callback === "function") { 
      // Call it, since we have confirmed it is callable​ 
      callback(linesArray); 
      console.log("Called callback"); 
    } 
} 



program 
    .version('0.0.1') 
    .arguments('<file>') 
    .usage('[options] <file>') 
    .option('-n, --number <number>', 'Display the last number of lines') 
    .option('-f, --follow', 'Follow the file and display the last 10 lines as new lines are appended') 
    .action(function(file) { 
     fileValue = file; 
    }) 
    .parse(process.argv); 

if(!program.args.length) { 
    program.help(); 
} else { 
    //console.log('Keywords: ' + program.args); 
    console.log("File: " + fileValue); 

    if (program.number && program.follow) { 
     console.log(' - follow'); 
     console.log(' - number'); 
     console.log('Number passed to number option: ' + program.number); 

    } else { 

     if (program.number) { 
      console.log(' - number'); 
      console.log('Number passed to number option: ' + program.number); 

      console.log(readFile(fileValue, function(linesArray){ 
       console.log("Hello from readFile callback! \nAbout to output file lines!"); 
       var i = 0; 
       var count = linesArray.length; 
       var totalString = ""; 

       console.log(count);  

       for (i = count - 11; i <= count - 1; i++) { 
        totalString += linesArray[i]; 
        totalString += '\n'; 
        console.log(linesArray[i]); 
       }   

      })); 
     } 

     if (program.follow) { 
     console.log(' - follow'); 
     }   
    } 
} 

if (program.args === null) program.help(); 

そして、ここでは、不可解な(少なくとも私には)一部、出力されます。要するに、ファイルの読み込みが完了したときに必要な行を出力するコールバックが呼び出されるように設定しようとしています。

File: Word_List.txt 
    - number 
Number passed to number option: 10 
Type of callback: function 
Hello from readFile callback! 
About to output file lines! 
0 
undefined 
undefined 
undefined 
undefined 
undefined 
undefined 
undefined 
undefined 
undefined 
undefined 
undefined 
Called callback 
undefined 
Hello from fs.readFile callback! 
Reading file: Word_List.txt 
Hello from fs.readFile callback! Have just read the contents of file. 
There are 235887 lines in the file! 
Returned linesArray from fs.readFile callback! 

EDIT1:

function writeLines(linesArray){ 
    console.log("Hello from writeLines callback! \nAbout to output file lines!"); 
    var i = 0; 
    var count = linesArray.length; 
    var totalString = ""; 

    console.log(count);  

    for (i = count - 11; i <= count - 1; i++) { 
     totalString += linesArray[i]; 
     totalString += '\n'; 
     console.log(linesArray[i]); 
    }   
} 

function readFile(fileValue, writeLines){ 
    fs.readFile(fileValue, function(err, data, writeLines) { 
     console.log("Hello from fs.readFile callback! \nReading file: " + fileValue); 
     var i = 0; 
     if(err) throw err; 
     linesArray = data.toString().split("\n"); 
     console.log("Hello from fs.readFile callback! Have just read the contents of file.\nThere are " + linesArray.length + " lines in the file!"); 
     for(i = 0; i <= linesArray.length - 1; i++) { 
      //console.log(i +": " + linesArray[i]); 
     } 
     writeLines(linesArray); 
    }); 
} 

編集2: ここの出力EDIT1

File: Word_List.txt 
    - number 
Number passed to number option: 10 
/usr/local/lib/node_modules/test/NodeTail.js:44 
    writeLines(linesArray); 
    ^

TypeError: writeLines is not a function 
    at readFile (/usr/local/lib/node_modules/test/NodeTail.js:44:5) 
    at Object.<anonymous> (/usr/local/lib/node_modules/test/NodeTail.js:77:20) 
    at Module._compile (module.js:425:26) 
    at Object.Module._extensions..js (module.js:432:10) 
    at Module.load (module.js:356:32) 
    at Function.Module._load (module.js:313:12) 
    at Function.Module.runMain (module.js:457:10) 
    at startup (node.js:138:18) 
    at node.js:974:3 
+2

コールバックを 'fs.readFile'コールバックの外で実行しています。' fs.readFle(...、function(err、data){/ *ここで* /}); ' –

+0

これは私があなたのコメントを見た前に。私はいくつかのことを再コーディングし、コードのニアエンドで 'TypeError:writeLines is not a function'を取得しています。 – MadPhysicist

+1

@MadPhysicistあなたは完全なログを投稿して、あなたが参照しているコードの領域を強調表示できますか? –

答えて

1

fs.readFileはあなたが読んですることを意味します非同期メソッドです彼が準備ができているときにファイルします残りのコードは、読み込みが完了するまで処理されます。つまり、ファイルが読み込まれる前にコールバックが呼び出されます。あなたはオプションに持って

  1. は終わりfs.readFileコールバック内でコールバック関数を置きます。
  2. fs.readFileSyncを使用すると、コードを同期的に実行できるので、ファイルの読み込みを完了した後にのみコールバックメソッドが呼び出されます。

私はNode.jsの仕組みであるため、最初のオプションが優れていると思います。

+0

私は#1の線に沿って作業していました。私はその質問を編集した。最後に、 'TypeError:writeLines is not a function'を取得しています。 – MadPhysicist

+0

完了。ご協力いただきありがとうございます! – MadPhysicist

+0

@MadPhysicistあなたは大歓迎です! –

関連する問題