2012-08-02 3 views
0

Hej,콜백에 데이터 오버 핸드

나는 node.js와 그 콜백 메커니즘을 실험하고있다. 그리고 지금은 익명의 콜백에 데이터를 내리던하는 방법을 궁금해 : 난에 대한 내부 호출이 항상 4를 반환하는 이유

var fs = require('fs'); 

for (var i = 0; i < 4; i++) { 
    console.log('Outer: ' + i); 
    fs.readFile('/etc/hosts', 'ascii', function(err, data) { 
     console.log('Inner: ' + i); 
    }); 
} 

나는 이해한다. 그러나 특정 readFile 콜백 함수에 몇 가지 변수를 어떻게 제공 할 수 있습니까? (그래서 inner i는 outer i의 값을가집니다)? 콜백 함수가 소비자 역할을하는 큐 메커니즘을 상상할 수도 있지만, 노드 초보자로서 모범 사례를 요구하고 싶습니다. 고마워요,

순수 자바 스크립트 (즉, 같은 비동기 같은 라이브러리를 사용하지 않는 것입니다)와 mechko

+0

아니 전체 솔루션도 설명 (내가 주석) : 당신은 비동기 좀보고 할 수 있습니다. https://github.com/caolan/async – Viehzeug

답변

1

: 또는

var fs = require('fs'); 

var i, 
    reader = function (i) { 
     return function (err, data) { 
      console.log('Inner: ' + i); 
     } 
    }; 

for (i = 0; i < 4; i++) { 
    console.log('Outer: ' + i); 
    fs.readFile('/etc/hosts', 'ascii', reader(i)); 
} 

또는를,

var fs = require('fs'); 

var i; 

for (i = 0; i < 4; i++) { 
    console.log('Outer: ' + i); 
    fs.readFile('/etc/hosts', 'ascii', function (i, err, data) { 
     console.log('Inner: ' + i); 
    }.bind(null, i)); 
} 

(이동 var i; 루프의 for 루프는이 특정 예제에서 실제로 아무 것도 변경하지 않습니다. 이는 자바와 관련된 버그를 방지하기위한 코드 스타일 일 뿐이며, Java와 같은 프로그래밍 언어와 달리 변수의 기능 범위 만 가지고 있으므로 원래 예제에서는 for 루프가 아닌 전체 모듈에 대해 i이 선언됩니다.

다른 방법은 다음과 같이 asyncunderscore 등의 라이브러리를 사용하는 것입니다 :

var _ = require('underscore'), 
    async = require('async'), 
    fs = require('fs'); 

async.parallel(_.map(_.range(0, 4), function (i) { 
    return async.waterfall.bind(null, [ 
     fs.readFile.bind(null, '/etc/hosts', 'ascii'), 
     function (data, callback) { 
      console.log("Inner: " + i); 
      callback(); 
     } 
    ]); 
}, function (err) { 
    if (err) { 
     console.log("Some read attempt failed"); 
    } else { 
     console.log("Done reading"); 
    } 
}); 
+0

조언을 위해 Viehzeug와 panatur를 사용해 주셔서 감사합니다. 이제 비동기로 작업하게되었습니다. – mechko

관련 문제