수색…


소개

비동기 콜백을 사용할 때는 범위를 고려해야합니다. 특히 루프 내부에있는 경우. 이 간단한 기사는하지 말아야 할 일과 간단한 작업 예제를 보여줍니다.

잘못된 코드, 왜이 키 사용이 버그로 이어질지 알아낼 수 있습니까?

var pipeline = {};
// (...) adding things in pipeline

for(var key in pipeline) {
  fs.stat(pipeline[key].path, function(err, stats) {
    if (err) {
      // clear that one
      delete pipeline[key];
      return;
    }
    // (...)
    pipeline[key].count++;
  });
} 

문제는 var 키의 인스턴스가 하나 밖에 없다는 것입니다. 모든 콜백은 동일한 키 인스턴스를 공유합니다. 콜백이 시작될 때 키가 증가하고 통계를받는 요소를 가리 키지 않을 가능성이 높습니다.

올바른 글쓰기

var pipeline = {};
// (...) adding things in pipeline

var processOneFile = function(key) {    
  fs.stat(pipeline[key].path, function(err, stats) {
    if (err) {
      // clear that one
      delete pipeline[key];
      return;
    }
    // (...)
    pipeline[key].count++;
  });
};
    
// verify it is not growing
for(var key in pipeline) {
  processOneFileInPipeline(key);
}

새로운 함수를 생성함으로써 모든 콜백이 그들 자신의 키 인스턴스를 가지도록 함수 안에서 를 범위 지정합니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow