2

Node와 함께 async/await에 문제가 있습니다. 내가 이것을 시도하면 :비동기 함수의 결과가 정의되지 않음을 나타냅니다.

function Read_Json_File() { 
    fs.readFile('import.json','utf-8',(err, data) => { 
     if (err) throw err; 
     json_data = JSON.parse(data); 

     return json_data; 

    }); 
} 

async function run_demo() { 
    let get_json_file = await Read_Json_File(); 
    console.log(get_json_file); 
} 

run_demo(); 

그것은 JSON 대신에 파일에서 정의를 반환합니다. 파일 읽기가 끝나기를 기다리지 않는 이유는 무엇입니까?

답변

3

, 따라서 당신은 정의되지 않은 얻을 - 당신은 아무것도 발생하지 않습니다 콜백에서 데이터를 반환하고 있습니다. 대신 async/await를 사용하려면 fs.readFile이 이미 없으므로이를 확인해야합니다.

function readJSONFile() { 
    return new Promise((resolve, reject) => { 
    fs.readFile('import.json', 'utf-8', (err, data) => { 
     if (err) reject(err); 
     resolve(JSON.parse(data)); 
    }); 
    }); 
} 

기다리고 있습니다는 기다릴 실제 약속이 필요합니다 그럼 당신은 비동기/await를 사용할 수 있습니다. 이것이하는 일은 기다려야 할 약속을 되 찾는 것입니다. 우리가 resolve를 호출 할 때까지 따라서, 우리는 기다릴 - 우리는 JSON을로드가 완료 할 때 일어나는 :

let json = await readJSONFile(); 
console.log(json); 

가 여기에 우리가 readJSONFile를 호출합니다. 이것은 JSON 파일 로딩이 끝났을 때 해결되는 약속을 반환하고, 비동기 코드의 겉으로보기에는 동기 실행을 허용합니다.

 function Read_Json_File() { 
      return new Promise(resolve,reject => { 
      fs.readFile('import.json','utf-8',(err, data) => { 
       if (err) reject(err); 
       json_data = JSON.parse(data); 

       resolve(json_data); 
      }); 

    } 
+0

그래 지금은 꿈 덕분처럼 작동하지만 난 약속을 사용하지 않고 비동기/await를 사용할 수 있습니다 들었 –

+0

@OFSTTP 약속 *을 기다리고 있습니다. Async/await은 약속을위한 문법적 설탕입니다. 일단 비등 시키면 async/await은 단지 약속 일 뿐이므로 비동기 코드를 동 기적으로 실행할 수는 없습니다. 어느 정도 약속을 사용해야하며, 비동기/대기 기능은 결국 더 많은 약속이됩니다. – Li357

+0

@OFSTTP 참조 : https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/await –

1

약속 해결 및 거부를 놓쳤습니다.

아래와 같이 사용하십시오. 당신은 Read_Json_File 아무것도 반환하지 않는

function Read_Json_File() { 
    return new Promise((resolve,reject)=> { 
      fs.readFile('import.json','utf-8',(err, data) => { 
       if (err) reject(err); 
       json_data = JSON.parse(data); 

       resolve(json_data); 

      }); 
    } 
}); 
-1

그것을 시도. 그게 사실이야?
+0

이것은 두 개의 이전 답변, 이번에는 들여 쓰기가 잘못되었으며 설명 텍스트가 없습니다. –