2016-11-01 4 views
-2

d3에서 시각화를 만드는 프로젝트를 개발 중입니다. 순차적으로로드 할 파일 이름을 가진 배열이 있습니다.Javascript - Async

그러나 배열을 실행하고 각각의 메서드를 호출하면 배열의 두 번째 요소는 첫 번째 요소가로드되기 훨씬 전에 호출됩니다.

 for(j=0;j<chosenAirports.length;j++) 
     { 
      var fileName = chosenAirports[j]; 
      var splitData = fileName.split("_");     
      readFile(splitData[0],selectedYear,splitData[0] + "_" + selectedYear); 
     } 

readFile은 각 배열 요소를 호출하려고 시도하는 함수입니다. 그러나 하나의 요소에 대한 readFile이 완료되기 전에 루프의 다음 파일이 호출됩니다.

는 그리고 나는 이것이 자바 스크립트의 비동기 기능으로 인해 믿습니다. 누구나이를 피할 수있는 방법을 제안 할 수 있습니까?

도움을 주시면 감사하겠습니다.

+0

'readFile()'이라는 이름을 사용하여 모든 머리를 뒤엎고'readFile() '이 실제로 무엇을하는지 볼 수 있습니까? 함수가 입력, 출력 또는 내부적으로 수행되는 작업에 대해 세부 정보가없는 블랙 박스 인 경우 우리는 가정을하거나 도움을 줄 수 없습니다. – gelliott181

답변

0

파일을 읽는다면 Node에서이 파일이 실행되고 있다고 생각하십니까?

그래서 다음 readFile 기능 중 하나 노드의 readFile 기능 또는 를 호출하면 노드의 readFile 기능이됩니다.

당신이 언급 한 바와 같이

, 이것은 비동기 함수이다. 보고있는 문제를 방지 할 수있는 readFileSync이라는 동기식 버전이 있습니다.

0

동기 코드를 사용하려는 경우 동기식 readFileSync() 메서드를 사용하면 문제가 해결됩니다 (세부 정보 : https://code-maven.com/reading-a-file-with-nodejs).

비동기 기능을 확보에 관심이 있다면

는 RxJS의 약속 작업에 관심이있을 수 반환하지만 여전히 비동기 적으로 실행합니다.

+0

나는 당신을 모두 잘못된 방향으로 인도 할까봐 걱정된다.readFile은 파일에서 읽는 것을 의미하지 않습니다. 이것은 특정 작업을 수행하는 함수의 이름입니다 (파일과 관련이 없음). 완전한 정보를 제공하지 못해 죄송합니다. – Minu

0

비동기를 유지하려면 Node/Javascript의 코어와 맞서 싸울 필요가 없으므로 제안하십시오. Promise 내부에서 파일 처리를 래핑 할 수 있습니다. 처리 결과와 약속을 반환 whic 매개 변수와 같은 파일 이름을. 같은

뭔가 :

function processFile(fileName) { 
    return new Promise((resolve,reject) => { 
    fs.readFile(fileName, function(err, data){ 
     if (err) { 
     return reject(err); 
     }; 
     return resolve(processData(data)); 
    }); 
    }); 
} 

물론, 당신은 당신의 processData() 기능을 제공하고 지정된 파일의 처리를 위해 데이터를 반환 있는지 확인해야합니다. 최종 결과를 얻기 위해 그런 다음이 약속의 결과를 조회

const promise = chosenAirports.reduce((promise, fileName) => { 
    return promise.then((previousResult) => { 
    return processFile(fileName); 
    }) 
}, Promise.resolve()); 

:

그런 다음, 모든 파일의 처리 순서 체인, 당신은 같은 배열에 reduce 방법을 사용할 수 있습니다.

promise 
.then((result) => { 
    console.log('Result: ', result); 
}) 
.catch((err) => { 
    console.log(err); 
}); 

데이터를 처리하고 모든 결과를 수집하는 메커니즘을 구현하지만 그 해결책으로는 어렵지는 않습니다.