2

ノードで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の代わりにundefinedを返します。なぜファイルの読み込みが終了するのを待たないのですか?

答えて

3

あなたが未定義得るので、Read_Json_Fileから何かを返すていない - あなたは何も生じないコールバックからのデータを返すしています。代わりに、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ファイルのロードが完了したときに解決する約束を返し、非同期コードの一見同期実行を可能にします。

+0

ええ、今では夢のおかげのように動作しますが、私は約束を使用せずに非同期/のawaitを使用することができます聞きました。本当? –

+0

@OFSTTP *は期待しています*。 Async/awaitは、約束の文法的な砂糖です。一度それを煮詰めると、async/awaitはただの約束です - 非同期のコードを同期して実行することはできません。あなたはいつも約束をある程度使用しなければならなくなり、非同期/待望の機能は最終的にもっと約束になります。 – Li357

+0

@OFSTTP参照してください:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/await –

1

あなたは約束を逃して拒否しました。

下記のように使用してください。

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

はそれを試してください:

 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

これは正確なコピーです前回の2つの回答、今回は悪い字下げがあり、説明文はありません。 –

関連する問題