Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 异步读取文件_Node.js - Fatal编程技术网

Node.js 异步读取文件

Node.js 异步读取文件,node.js,Node.js,我试图使用fs.readFile()读取一个文件,然后在下面的代码中使用结果。读取过程必须是异步的。以下是我到目前为止的情况: var file = async () => { await fs.readFile(__dirname + "/file.json", "utf-8", (err, data) => { if (err) throw err return JSON.parse(data) }) } conso

我试图使用
fs.readFile()
读取一个文件,然后在下面的代码中使用结果。读取过程必须是异步的。以下是我到目前为止的情况:

var file = async () => {
  await fs.readFile(__dirname + "/file.json", "utf-8", (err, data) => {
    if (err) throw err
    return JSON.parse(data)
  })
}
console.log(file());
由于某些原因,此代码总是记录未定义的
。有没有办法在不移动
readFile
回调中的
console.log
语句的情况下执行此操作?

值得注意的修改: fs.promises.readFile=>如果不使用承诺,请不要使用等待。 如果你使用承诺=>不要使用回调

async function readFile() {
  const data = await fs.promises.readFile(__dirname + "/file.json", "utf-8");
  return JSON.parse(data)
}

(async() => {
  console.log(await readFile());
})();
有关同步版本,请参阅其他注释。(但出于性能原因,我更喜欢异步)

值得注意的修改: fs.promises.readFile=>如果不使用承诺,请不要使用等待。 如果你使用承诺=>不要使用回调

async function readFile() {
  const data = await fs.promises.readFile(__dirname + "/file.json", "utf-8");
  return JSON.parse(data)
}

(async() => {
  console.log(await readFile());
})();
有关同步版本,请参阅其他注释。(但出于性能原因,我更喜欢异步)

使用Promise

const someFunction = async () => {
    try {
        var file = () => {
            return new Promise((resolve, reject) => {
                fs.readFile(__dirname + "/file.json", "utf-8", (err, data) => {
                    if (err) reject(err)
                    else resolve(data)
                })
            })
            
        }
        console.log(await file()); // this is the key
    } catch (err) {
        console.log(err)
    }
}
您需要添加一个
try catch
块来捕获
reject
承诺或抛出的任何错误。所以更好

还是旧的函数样式

async function someFunction() {
    // the contents are the same
    // ...
}
问题是,
文件()
异步运行,代码不等待结果。将
await
放在
fs.readFile()
函数上并不意味着等待
file()
变量完成其执行。

使用Promise

const someFunction = async () => {
    try {
        var file = () => {
            return new Promise((resolve, reject) => {
                fs.readFile(__dirname + "/file.json", "utf-8", (err, data) => {
                    if (err) reject(err)
                    else resolve(data)
                })
            })
            
        }
        console.log(await file()); // this is the key
    } catch (err) {
        console.log(err)
    }
}
您需要添加一个
try catch
块来捕获
reject
承诺或抛出的任何错误。所以更好

还是旧的函数样式

async function someFunction() {
    // the contents are the same
    // ...
}

问题是,
文件()
异步运行,代码不等待结果。将
wait
放在
fs.readFile()
函数上并不意味着等待
file()
变量完成其执行。

在您的代码中,上面的
file
变量是一个函数。特别是函数
async()…
。您的代码类似于编写
异步函数文件(){…}
。也就是说,
file
是函数名,那么
async
应该放在哪里呢?因为即使是
console.log(file())
也不起作用。
async
关键字只会使函数返回一个承诺。所以你的
文件
函数将返回一个承诺。哦,好的。那么如何异步获取文件数据呢?您应该在记录结果之前等待结果,const result=wait file();console.log(result)在
文件上方的代码中是一个函数。特别是函数
async()…
。您的代码类似于编写
异步函数文件(){…}
。也就是说,
file
是函数名,那么
async
应该放在哪里呢?因为即使是
console.log(file())
也不起作用。
async
关键字只会使函数返回一个承诺。所以你的
文件
函数将返回一个承诺。哦,好的。那么如何异步获取文件数据呢?您应该在记录结果之前等待结果,const result=wait file();console.log(结果)