1. ホーム
  2. javascript

[解決済み] fs.readFileからデータを取得する

2022-03-17 14:47:48

質問

var content;
fs.readFile('./Index.html', function read(err, data) {
    if (err) {
        throw err;
    }
    content = data;
});
console.log(content);

ログ undefined なぜですか?

どのように解決するのですか?

Raynos が言ったことを詳しく説明すると、あなたが定義した関数は、非同期コールバックです。すぐに実行されるわけではなく、ファイルの読み込みが完了した時点で実行されます。readFileを呼ぶと、すぐに制御が戻され、次の行が実行されます。つまり、console.logを呼び出したときには、まだコールバックは起動されておらず、このコンテンツはまだ設定されていないのです。非同期プログラミングへようこそ。

アプローチ例

const fs = require('fs');
// First I want to read the file
fs.readFile('./Index.html', function read(err, data) {
    if (err) {
        throw err;
    }
    const content = data;

    // Invoke the next step here however you like
    console.log(content);   // Put all of the code here (not the best solution)
    processFile(content);   // Or put the next step in a function and invoke it
});

function processFile(content) {
    console.log(content);
}

あるいは、Raynosの例が示すように、呼び出しを関数でラップし、独自のコールバックを渡すのがより良い方法です。(非同期呼び出しをコールバックを受け取る関数でラップする習慣を身につけると、多くのトラブルや面倒なコードを省くことができると思います(どうやらこの方が良いようです)。

function doSomething (callback) {
    // any async callback invokes callback with response
}

doSomething (function doSomethingAfter(err, result) {
    // process the async result
});