2017-09-28 1 views
-1

파일을 JSON으로 읽으려고 시도하고 JSON을 조작 ​​한 다음 조작 된 JSON을 flatten 함수로 리턴합니다. 아래는 나의 약속과 평평한 기능입니다.약속에서 .then() 값을 반환 하시겠습니까?

약속

const fs = require('fs'); 

module.exports = (filePath) => { 
    return new Promise((fulfill, reject) => { 
    fs.readFile(filePath, 'utf8', (err, res) => { 
     if (err) reject(err); 
     else fulfill(res); 
    }); 
    }); 
}; 

것은 내가 {} 약속을 반환에 얻고 기능

flatten: (baseLoc, filePath, updateRev) => { 
return readFilePromise(filePath) 
    .then((data) => { 
     const jsonObject = Object.assign({}, data); 
     const flatJson = flattener(jsonObject, baseLoc); 
     if (flatJson.$meta) { 
     delete flatJson.$meta; 
     } 
     if (updateRev === true || updateRev === 'true') { 
     flatJson.id = incrementVersion(flatJson.id); 
     } 
     return flatJson; 
    }) 
    .catch(err => err); 
} 

을 평평하게. 내가 약속을 되 돌리지 않고 대신 returnJson statement에 의존한다면 나는 정의되지 않는다. StackOverflow/Google에서 이미 본 모든 것을 올바르게 구성했기 때문에 이것이 일어나는 이유는 확실하지 않습니다.

이상한 점은 코드를 통해 디버깅 할 경우 반환 값 flatJson 문이 실제로 원하는 값을 보유하고 있음을 알 수 있습니다. 다른 함수가 flatten 함수를 호출 할 때 종료하는 것입니다. 정의되지 않은 또는 {}와 함께.

+2

아무 래도 약속을 지키지 않아도 평평한 결과를 반환하는 데 '평평'하지 않습니다. 약속을 되 돌리거나 콜백을 받아 나중에 결과와 함께 호출합니다. –

+0

어떻게 부르십니까? 'flatten (...) .then (JSON.stringify) .then (send)'와 같은 것? – Bergi

+0

@Bergi 별도의 파일에서 app.flatten (params)으로 호출하고 있는데, 제공 한 구문을 사용하기 위해 flatten을 약속으로 설정해야합니까? 나는 이것들이 멍청한 질문이라면, 약속에 대해 상대적으로 미안합니다. – Steve

답변

0

에서만과 같이 비동기 컨텍스트 내부의 await를 키워드를 사용하여 동기 스타일로 비동기 함수의 결과를 얻을 수 있습니다

async function getResultDirect(req, res) { 
    let result = await flatten(baseLoc, filePath, updateRev); 
    return result; 
} 

하지만 그건 단지 비 동시성에게 스택 한 수준 아래로 숨 깁니다. 다른 방법은 없습니다.

관련 문제