2016-09-25 5 views
-2

내에 중첩되는 변수를받는 방법,이 코드가 있습니다. 나는 이걸 가지고 잠시 벽에 머리를 두드 리고 있었고, 내가 뭘 잘못하고 있는지 알 수 없다. 내가 아는 한, 코드는 비동기 적이 지 않습니다. html 값은 실제로 다른 함수에서 사용하고있는 html 코드의 문자열이어야합니다.다른 함수 그래서

+0

1. 직접 질문에 대답하기 위해, 당신은 둘 수 없습니다 . 특정 문제에 대한 답변 - 비동기 함수이므로 나중에 채워지는 값을 반환 할 수 없습니다. – vlaz

+0

전역을 선언하십시오. '.on ("end")'에서 html의 값을 전역에 할당하십시오. 'return html'을 제거하십시오. 이 질문을 삭제하십시오. 정확히 같은 수십 개의 다른 질문을 읽어보십시오. – Tibrogargan

답변

3

콜백 내가 여기 코드에 표시되는 내용에 따라, 비동기 : https://github.com/Osterjour/line-by-line/blob/master/line-by-line.js#L43-L45

setImmediate(function() { 
    self._initStream(); 
}); 

구문 분석은 이벤트 루프의 다음 "틱"때까지 시작되지 않습니다. 일반적으로 대부분의 콜백은 비동기 적으로 발생한다고 가정하는 것이 좋습니다. 또한 비동기로 에게 기능을 변환 할 수 있습니다 (또는 IMO 더 나은 약속과)

function readLineMemory(cb) { 
    let html = ''; 
    const loadFile = dialog.showOpenDialog({properties: ['openFile']}); 
    const lr = new LineByLineReader(loadFile[0]); 
    lr.on('error', err => { 
     cb(err); 
    }) 
    .on('line', function (line) { // called every line 
     const lineParse = JSON.parse(line); 
     JSONParsed.push(lineParse); 
     let htmlTabled = tableify(lineParse) + '<hr>'; 
     html = html + htmlTabled; 
    }) 
    .on('end', function() { // called when file is read fully 
     html = 'data:text/html,' + html; 
     cb(null, html); 
    }); 
} 

:

function readLineMemory() { 
    return new Promise(function (resolve, reject) { 
    let html = ''; 
    const loadFile = dialog.showOpenDialog({properties: ['openFile']}); 
    const lr = new LineByLineReader(loadFile[0]); 
    lr.on('error', err => { 
     reject(err); 
     }) 
     .on('line', function (line) { // called every line 
     const lineParse = JSON.parse(line); 
     JSONParsed.push(lineParse); 
     let htmlTabled = tableify(lineParse) + '<hr>'; 
     html = html + htmlTabled; 
     }) 
     .on('end', function() { // called when file is read fully 
     html = 'data:text/html,' + html; 
     resolve(html); 
     }); 
    }); 
} 
+0

이것은 내 문제를 본질적으로 해결했습니다! 그것이 나를 허용 할 것입니다. – willyb321