fs.writeFile不尊重函数的执行顺序(它总是最后执行)



我最近开始摆弄JavaScript (Node),我在一个执行文件写入的函数上遇到了问题。无论调用顺序如何,这个函数总是最后执行,我无法修复它,有人可以帮助我吗?(例如,在下面的代码中,categorySumPrice()函数应该在createAndWriteFixedJsonFile()函数之后运行,但它在此之前运行)程序如下:

// *********************  CLASSES  ****************
class Produto {
constructor(id, name, quantity, price, category) {
this.id = id
this.name = name
this.quantity = quantity
this.price = price
this.category = category
}
}
// *********************  Procedural  *************
// ------ Global variables
// vector of objects produto
var produtos = []
// file name
const fileName = "broken-database.json"
//fixed file name
const fixedFileName = "./arquivo.json"
// file open require
const fs = require("fs")
//Read and Writing modes, like C
/* 
r - Open file for reading
r+ - Open file for reading and writing
rs - Open file for reading synchronous mode
rs+ - Open file for reading and writing, synchronous mode
w - Open file for writing synchronous mode (if not exists file, created that)
wx - Open file for writing (if not exists file, dont created that)
w+ - Open file for writing and reading (if not exists file, created that)
wx+ - Open file for writing and reading (if not exists file, dont created that)
*/
// Fix JSON Part
// open broken database
var jsonFileName = openFile(fileName)
//read json file, fix, if necessary, and create objects produto
readFile(jsonFileName)
//save new JSON file fixed
createAndWriteFixedJsonFile(fixedFileName)
//sum price functions
categorySumPrice()

// *********************  FUNÇÕES  *************
// Open File
function openFile(_file_name) {
try {
console.log('********************************')
console.log('*  Arquivo aberto com sucesso  *')
console.log('********************************')
return fs.readFileSync(_file_name, 'utf-8')
} catch (err) {
console.error(err)
}
}
// Fix JSON File and create objects produto
function readFile(_json_File) {
// Create produtos objects
try {
console.log('********************************')
console.log('*   Os dados serão corrigidos, *')
console.log('*   se necessário.             *')
console.log('********************************')
const data = JSON.parse(_json_File)
for (var i in data) {
produtos[i] = new Produto(parseInt(data[i].id), fixString(data[i].name),
fixQuantity(data[i].quantity), fixPrice(data[i].price), data[i].category)
}
console.log('********************************')
console.log('*   Dados obtidos com sucesso  *')
console.log('********************************')
}
catch (err) {
console.log(`Erro: ${err}`)
}
}
// create and write fixed Json file
function createAndWriteFixedJsonFile(_fixedFileName) {
try {
fs.writeFile(_fixedFileName, JSON.stringify(produtos, null, 2), err => {
if (err) {
console.log(err)
}
else {
console.log('********************************')
console.log('*  Arquivo criado com sucesso  *')
console.log('********************************')
}
})
} catch (err) {
console.error(err)
}
}

function fixQuantity(quantityToFix) {
let quantity
if (isNaN(quantityToFix)) {
quantity = 0
}
else {
quantity = parseFloat(quantityToFix)
}
return quantity
}
function fixPrice(priceToFix) {
return parseFloat(priceToFix)
}
// Fix string function
function fixString(stringToFix) {
// Quatro tipos de erros conhecidos:
/* 
"a" por "æ", 
"c" por "¢", 
"o" por "ø", 
"b" por "ß".
*/
// o /g significará que todos os valores correspondentes serão substituídos.
// por padrão, replace substitui somente a primeira ocorrência
stringToFix = stringToFix.replace(new RegExp(/æ/g), "a");
stringToFix = stringToFix.replace(new RegExp(/¢/g), "c");
stringToFix = stringToFix.replace(new RegExp(/ø/g), "o");
stringToFix = stringToFix.replace(new RegExp(/ß/g), "b");
return stringToFix
}
function categorySumPrice() {
let estoquePorCategoria = []
let indice
let countCategories = 0
for (var i in produtos) {
if (i === 0) {
estoquePorCategoria[countCategories] = { categoria: produtos[i].category, valor: (produtos[i].quantity * produtos[i].price) }
countCategories++
}
else {
indice = estoquePorCategoria.indexOf(estoquePorCategoria.filter(function (obj) {
return obj.categoria == produtos[i].category;
})[0]);
if (indice != -1) {
estoquePorCategoria[indice].valor += (produtos[i].quantity * produtos[i].price)
}
else {
estoquePorCategoria[countCategories] = { categoria: produtos[i].category, valor: (produtos[i].quantity * produtos[i].price) }
countCategories++
}
}
}
console.log(estoquePorCategoria)
}

writeFile是一个异步函数,这意味着它将与其他事情并行执行。所以:

  1. 你调用writeFile然后它开始写
  2. 当你写代码的时候,其余的代码继续执行。
  3. writeFile写入完成。

为了让它与你的其他代码同步执行,你需要使用writeFileSync

当你的代码的其余部分不依赖于该文件时,你应该使用writeFile,如果它依赖于writeFileSync

您可以使用fs.writeFileSync,它将根据您的工作流程运行。

在这里了解更多信息- https://www.geeksforgeeks.org/node-js-fs-writefilesync-method/

fs.writeFile()是异步执行的,这意味着categorySumPrice()createAndWriteFixedJsonFile()之前执行,因为它需要时间来保存文件。

为了避免这种情况,你需要从fs.writeFile()的回调函数中调用categorySumPrice():

// create and write fixed Json file
function createAndWriteFixedJsonFile(_fixedFileName) {
try {
fs.writeFile(_fixedFileName, JSON.stringify(produtos, null, 2), err => {
if (err) {
console.log(err)
}
else {
console.log('********************************')
console.log('*  Arquivo criado com sucesso  *')
console.log('********************************')
//And now is the time for executing the following:
categorySumPrice();
}
})
} catch (err) {
console.error(err)
}
}

最新更新