Saya memiliki fungsi (sebut saja f1) yang memanggil fungsi lain (sebut saja f2) di dalamnya. Masalahnya adalah bahwa f2 seharusnya mengembalikan output file json yang diurai. Tapi itu selalu kembali tidak terdefinisi.

async function f1(){
    var customerDataArray = []
    fs.readdirSync(jsonFolder).forEach(file => {
        var temp = path.extname(file)
        if (temp == '.json'){
            customerDataArray.push(file)
        }
    });
    
    let templateFiles = customerDataArray
    console.log(templateFiles)
    
    for(let tfc=0; tfc < templateFiles.length ; tfc++){
        let fileName = templateFiles[tfc]
        let filePath = './fashion/test/' + fileName
        const templateJSON = await f2(filePath)
        console.log(templateJSON)
    }

    console.log(templateJSON)
}

async function f2(filePath) {
    fs.readFile(filePath, "utf8", (err, jsonString) => {
        if (err) {
          console.log("Error reading file from disk:", err);
          return;
        }
        try {
          const customer = JSON.parse(jsonString);
          return customer
        } catch (err) {
          console.log("Error parsing JSON string:", err);
        }
      });
  }

Anda dapat mengabaikan detail file lainnya. Saya dapat menampilkan file yang diuraikan di f2 menggunakan console.log(pelanggan). Tetapi ketika dikembalikan ke f1, templateJSON tidak terdefinisi.

Bantuan apa pun dihargai!

0
Danush Aaditya 17 Mei 2021, 21:44

1 menjawab

Jawaban Terbaik

Anda tidak dapat mencampur dan mencocokkan asinkron berbasis panggilan balik dengan asinkron berbasis janji (async/await).

Umumnya, Anda dapat menjanjikan fungsi berbasis panggilan balik, tetapi untuk fs, sudah ada fs/promises (sejak Node 10).

Dengan demikian, kode Anda dapat disederhanakan menjadi seperti ini. Namun, itu tidak akan membaca file secara paralel; jika Anda memiliki sangat banyak file, akan mudah menyebabkan "Terlalu banyak file yang terbuka" tanpa menambahkan sesuatu seperti p-queue atau p-limit ke dalam campuran.

const fsp = require("fs/promises");

async function f1() {
  const files = await fsp.readdir(jsonFolder);
  const customerDataArray = files.filter((f) => path.extname(f) == ".json");

  for (let i = 0; i < customerDataArray.length; i++) {
    const filePath = "./fashion/test/" + templateFiles[i];
    const templateJSON = await f2(filePath);
    console.log(templateJSON);
  }
}

async function f2(filePath) {
  const content = await fsp.readFile(filePath, "utf8");
  return JSON.parse(content);
}
0
AKX 17 Mei 2021, 18:48