2017-03-17 6 views
0

次のコードブロックを考慮して、loadConfig()がJSON構成オブジェクトを返すのはどうでしょうか?返された設定は、変数設定として定義されていないJavascriptネストされた関数が返される

function loadConfig(){ 
    fs.readFile('./config.json', 'utf8', function (err, data){ 
    if (err) throw err; 
    var config = JSON.parse(data); 
    }); 
    return config; 
}; 

はloadConfig()関数の範囲外で、まだreturn文がreadFileの匿名関数の内部に位置している場合、それは(loadConfigに通って落下しません)、一見ネストされた無名関数を破るだけです。

これを解決する別の試みは、メイン関数loadConfigによって返される変数に無名関数を保存しても無駄になります。

function loadConfig(){ 
    var config = fs.readFile('./config.json', 'utf8', function (err, data){ 
    if (err) throw err; 
    var config = JSON.parse(data); 
    return config; 
    }); 
    return config; 
}; 

上に示した状況では、loadConfig()はconfig JSONオブジェクトをどのように返しますか?

+0

'readFile'はasyncなので、その関数から' return'することはできません。 – tymeJV

+0

約束を読む – Roljhon

+0

約束はあなたの友人です! –

答えて

2

だけの約束を使用/定義します。 readFileは非同期のmthodです。

function loadConfig(){ 
    var fileContent = fs.readFile('./config.json', 'utf8').toString(); 
    return fileContent?JSON.parse(fileContent):null; 
}; 
+0

これはこれを行うための最良の方法です、または成功を使用してください – user7417866

+0

だから私はいつでも参照できる設定オブジェクトでグローバル変数を持つことはできません。私はconfigVar.then(...);を使用する必要があります。 configオブジェクトにアクセスするには、「then関数」への入力を返すことはできません。私はこれで正しいですか? –

+0

グローバル変数を使用することはできますが、アクションが非同期であるため、その変数がいつ入力されるかはわかりません。 'then'を使うことで、これを避けることができます。これは、configが設定されると直ちに次の関数で使用できるからです。これは約束または将来(他の言語で)と呼ばれ、非同期アクションを扱う慣習的な方法です。あなたは基本的に何らかの結果が得られたら直ちにそれを使うことができる関数を返しています。詳細はこちらhttps://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise – caisah

0

簡単な回答はできません。

これは非同期呼び出しであり、返信文が応答を待たずに実行され続けることを意味します。したがって、関数を呼び出すとreturn文が最初に起動され、応答が返されます。

代わりに、

-2

またreadFileのの同期バージョンを使用することができますかはい、約束は、他のソリューションです。..値を返す、あなたの操作のための成功コールバック関数を使用していません。ここ ドク:

function loadConfig(){ 
    return new Promise(function(resolve, reject) { 
    fs.readFile('./config.json', 'utf8', function (err, data){ 
     if (err) reject(err); 

     var config = JSON.parse(data); 
     resolve(config); 
    }); 
    }) 
}; 

とそれを使用する:

loadConfig().then(function(config) { 
    // do something with the config 
}).catch(function(err){ 
    // do something with the error 
}); 
+0

同期呼び出しを使用することは推奨されていません。これはブラウザをハングアップし、ページが応答しなくなります。 – user7417866

+0

これはブロッキングコールと恐ろしいアイデアで、すべての方法が非同期で行われます –

関連する問題