2013-07-27 8 views
0

로컬 foo.txt에있는 내용을 읽는 기능을 구현 중입니다.예기치 않게 변수가 지워졌습니다.

var fs = require("fs"); 
var path = require("path"); 

var realpath = path.resolve("./foo.txt"); 

fs.open(realpath, "r", function(err, fd){ 
    if (err) { throw err; }; 
    var buf = new Buffer(1024), 
    bufOffset = 0, 
    bufLength = buf.length, 
    result = ""; 

    var recursive = function(position) { 
     buf = new Buffer(1024) 
     fs.read(fd, 
       buf, 
       bufOffset, 
       bufLength, 
       position, 
       function(err, bytesRead, buffer) { 
        if (err) { throw new Error("Opps!"); }; 
        if (bytesRead > 0) { // Block** 
         result = result.concat(buffer.slice(0, bytesRead).toString()); 
         recursive(bytesRead + position); 
        } 
       }); 
    }; 

    recursive(0); 
    console.log(result); 
}); 

재귀 적 방법을 사용했습니다. 이 프로그램을 실행 한 후에 나는 아무것도 얻지 못했습니다. 하지만 위의 Block **에서 console.log (결과)를 사용하면 작동합니다. 프로그램이 열린 블록으로 돌아간 후에 왜 결과가 정리 되나요? 감사.

+0

'fs.read'는 "Sync"로 끝나지 않는 대부분의 NodeJS 메소드와 마찬가지로 비동기입니다. –

답변

1

read 메서드의 비동기 특성으로 인해 변수를 인쇄 할 때까지 result 변수가 채워지지 않았습니다. 그것이 완료를위한 콜백을 제공하는 지점입니다.

+0

따라서 비동기 함수에서 일부 작업을 수행하기 위해 외부 범위의 변수를 어떤 방법으로 사용할 수 있습니까? –

+1

'read'의 동기 버전 인'readSync' 함수를 사용할 수 있습니다. –

관련 문제