2016-08-31 2 views
2

노드와 비동기식으로 상호 작용하고 콜백 및 인터넷 검색 작업을 수행하는 데 몇 가지 문제가 있습니다. 나는 마침내 너희들을 바라본다.'readline'을 사용하여 node.js 프로그램에 대한 동기 실행

노드의 readline 모듈을 사용하여 파일에서 줄을 읽어야하는 프로그램이 있습니다. 이 파일에는 노드 프로그램 내에서 정의 된 일부 비동기 함수에 전달되는 데이터가 들어 있습니다. 모든 데이터가 성공적으로 읽고 처리되면이 데이터를 JSON 형식으로 파싱 한 다음 출력해야합니다.

내 문제는 여기서 내가 호출 할 때 : readLine.on('close', function() { ...... } 비동기 함수가 실행되기 전에 실행되므로 아무 것도 출력되지 않지만 프로그램이 비동기 함수를 계속 실행합니다.

좀 더 명확하게 내 상황을 설명해야한다 기능의 간단한 골격을 만든 : 내가 처음/secondAsynFunction에 콜백을 추가하기 위해 노력했다

function firstAsyncFunc(dataFromFile) { 
    //do something asynchronously 

    return processedData; 
} 


function secondAsyncFunc(dataFromFile) { 
    //do something else asynchronously 

    return processedData; 
} 


//create readline 
var lineReader = require('readline').createInterface({ 
    input: require('fs').createReadStream('data.txt') 
}); 


//array to hold all the data processed 
var totalDataStorage; 


//read file 
lineReader.on('line', function(line) { 

    var processedData = firstAsyncFunction(line); 
    var moreProcessedData = secondAsyncFunction(line); 


    //store processed data and concatenate into one array 
    var tempDataStorage = [{ 'first': processedData, 'second': moreProcessedData }] 
    totalDataStorage = totalDataStorage.concat(tempDataStorage); 

}).on('close', function() { 

    var JSONString = JSON.stringify(... //create JSON for totalDataStorage ...); 
    console.log(JSONString); //DOESN'T OUTPUT ANYTHING! 

}); 

을, 나는 읽기와 분석을 만들기 위해 노력했다 조금씩 프로그램의 분리 된 함수를 만들고, 콜백을 작성하여 읽기가 끝났을 때 구문 분석을 호출하기 만하면되지만, 그 솔루션은 작동하지 않는 것 같고 정말 고민 중입니다.

감사합니다.

편집 : data.txt라는 파일 형태

IPData1 DataCenter1 
IPData2 DataCenter2 
... 
IPDataN DataCenterN 

나는 각각의 값을 얻을하고 적절하게 전달하는 str.split를 ("")를 사용이다. IPData은 숫자이며, 데이터 센터는 문자열

+0

당신은 data.txt라는 파일을 공유 할 수 있습니까? 나는 너에게 대답 할 수 있다고 믿는다. – Bamieh

+0

@JaromandaX OP의 코드를 다시 보아라. 문자열이 아니라 배열입니다. –

+0

data.txt 파일의 형식은'IPData, DataCentre'입니다. 실제 프로그램에서는 str.split ("")을 사용하여 두 값을 분리 한 다음 필요한 함수에 전달합니다. IPData는 숫자이고 DataCentre 값은 문자열입니다. 희망이 도움이 – OliverOstach

답변

1

비동기 함수는 값을 반환하지 않습니다,하지만 당신은 대신에 콜백 함수를 통과해야합니다. 사용자의 라인

var processedData = firstAsyncFunction (line);

전혀 이해가되지 않습니다. 당신의 data.txt 파일이

IPData1 DataCenter1 
IPData2 DataCenter2 
IPData3 DataCenter3 

과 같은 경우

var fs = require('fs'); 
var rl = require('readline').createInterface({ 
    input: fs.createReadStream('data.txt') 
}); 
var arr = []; 

rl.on('line', a => { 
    a = a.split(' '); 
    arr.push({ 
    first: a[0], 
    second: a[1] 
    }); 
}).on('close',() => { 
    console.log(JSON.stringify(arr, null, 2)); 
}); 

을 다음과 같이 그것은

[ 
    { 
    "first": "IPData1", 
    "second": "DataCenter1" 
    }, 
    { 
    "first": "IPData2", 
    "second": "DataCenter2" 
    }, 
    { 
    "first": "IPData3", 
    "second": "DataCenter3" 
    } 
] 
+0

도움을 주셔서 감사합니다.하지만 불행히도 이것은 작동하지 않습니다. 비동기 함수에서 결과를 '반환'하는 콜백 함수를 등록한 다음'lineReader.on ('line', ...)'에서 적절하게 호출했지만 여전히' .on ('close')', ** ** 비동기 함수가 끝나고 ** 비동기 함수가 끝났으며 결과를 반환했습니다. (이것이 내 문제 였고 나는 그 밖의 모든 것을 올바르게하고 있음을 확인할 수있었습니다!) – OliverOstach

+0

@OliverOstach 당신은 단순히 비동기 함수의 작동 방식을 이해할 수 없습니다. 정의에 따라 비동기 함수 **는 ** 값을 반환 할 수 없으므로 비동기 호출을 중지하십시오. 값을 반환하면 ** onClose 이벤트가 시작되기 전에 ** 반드시 실행되어야합니다. 이는 v8 엔진이 작동하는 방식이기 때문에 실행해야합니다. 내 대답이 어떻게 작동하지 않는다고 생각하니? 너 해봤 니? 복사 - 붙여 넣기하여 제대로 작동하는지 확인하십시오. –

0

를 기록합니다 데이터를 읽을 수 있습니다 나는 다음과 로컬 작업 변경되었습니다.

  1. 사용은 여러분의 인생을 더 쉽게 만드는 것을 약속드립니다.
  2. 제거 .close 당신은 인터페이스에 정의 된 출력을 해달라고 때문이다. 다음 중 하나가 발생할 때

'확대'이벤트가 방출된다

  1. rl.close() 메소드를 호출하고 readline에있다.인터페이스 인스턴스는 입력 스트림과 출력 스트림에 대한 제어를 포기했습니다.
  2. 입력 스트림은 'end'이벤트를 수신합니다.
  3. 입력 스트림은 EOT (signal end-of-transmission)를 수신합니다.
  4. 입력 스트림에 -C가 신호 SIGINT로 수신되고 readline.Interface 인스턴스에 등록 된 SIGINT 이벤트 수신기가 없습니다.
function firstAsyncFunc(dataFromFile) { 
    return new Promise(function(resolve, reject) { 
    //do something asynchronously 
    resolve(result); 
    }) 
} 

function secondAsyncFunc(dataFromFile) { 
    return new Promise(function(resolve, reject) { 
    //do something asynchronously 
    resolve(result); 
    }) 
} 

//create readline 
var lineReader = require('readline').createInterface({ 
    input: require('fs').createReadStream('data.txt') 
}); 

//array to hold all the data processed 
var totalDataStorage; 

//read file 
lineReader.on('line', function(line) { 
    Promise.all([ 
     firstAsyncFunc(line), 
     secondAsyncFunc(line) 
    ]) 
    .then(function(results) { 
     var tempDataStorage = [{ 
     'first': results[0], 
     'second': results[1] 
     }]; 
     // i'd use push instead of concat 
     totalDataStorage = totalDataStorage.concat(tempDataStorage); 
    }); 
}) 
+0

이것은 작동 할 수있는 것처럼 보이지만 모든 asynchnorous 기능이 로깅 단계에서 실행되도록 데이터를 기록 할 위치를 파악할 수 없습니다. – OliverOstach

관련 문제