【发布时间】:2020-06-05 08:13:57
【问题描述】:
我是 JavaScript 新手,在 Node.JS v12.13.1 中编写 JS 代码。
我正在尝试异步读取文件并通过承诺返回字符串值。
到目前为止,大多数函数返回 undefined 值,而其他函数返回 [object Promise] 值。
writeFile 函数有效,我可以验证 out.txt 是否包含“测试数据”
我对堆栈溢出帖子进行了研究,我只是感到困惑。
How to read file with async/await properly?
Using filesystem in node.js with async / await
Using Promises with fs.readFile in a loop
API 文档:
https://nodejs.org/api/fs.html#fs_fs_promises_api
有人可以告诉我我缺少什么吗?我将不胜感激,因为我已经进行了大约 3 天的反复试验研究。
谢谢!
function writeFile(data) {
const fs = require('fs');
fs.writeFile('out.txt', data, (err) => {
if (err) throw err;
});
}
function readFile1() {
const fs = require('fs').promises;
(async() => {
try {
const result = await fs.readFileSync('out.txt', 'utf8');
console.log(result);
} catch(e) {
console.error(e);
}
})();
}
function readFile2() {
const fs = require('fs');
const { promisify } = require('util');
const readFile = promisify(fs.readFile);
(async() => {
try {
const result = await readFile('out.txt', 'utf8');
console.log(result);
} catch(e) {
console.error(e);
}
})();
}
function readFile3() {
const fs = require('fs');
const util = require('util');
const readFile = util.promisify(fs.readFile);
function getStuff() {
return readFile('out.txt', 'utf8');
}
getStuff().then(data => {
console.log("Inside getStuff Method: "+data);
})
}
function readFile4() {
const fs = require('fs');
const fsPromises = fs.promises;
try {
return fsPromises.readFile('out.txt');
} catch (err) {
console.error('Error occured while reading file!', err);
}
}
async function readFile5() {
const fs = require('fs');
const fsPromises = fs.promises;
let fileHandle = null;
try {
fileHandle = await fsPromises.open('out.txt');
await fileHandle.readFile();
} finally {
if (fileHandle) {
await fileHandle.close();
}
}
return fs.readFileSync('out.txt', 'utf8');
}
writeFile("Test Data");
myString = readFile5();
console.log("The String Value is: " + myString);
【问题讨论】:
-
readFile5是异步的......因此,在执行myString = readFile5();时 - 保证myString将是一个 Promise,无论您在该函数中做什么(对或错),它返回一个承诺 -
@JaromandaX 好的,它返回承诺是有道理的,它在我的控制台中显示为:“字符串值是:[object Promise]”---但我感到困惑的是如何让实际文本“测试数据”显示而不是 [object Promise],也许我错过了一步?
-
promise 有一个
.then方法...或者使用 async/await -
@JaromandaX 非常感谢,我记得 Rahul Shetty 在 udemy 上通过 AngularJS 粗略地完成了这个,他也解释了 promise 的 then() 方法。感谢您抽出宝贵时间帮助我解决这个问题;)
标签: javascript node.js asynchronous promise