我正在嘗試構建一個腳本來讀取和寫入一些檔案。這些函式作業正常,但我無法異步執行讀/寫函式。我遇到的主要問題是我正在嘗試撰寫一個檔案,然后我正在嘗試匯入它。例如:給定這兩個函式,第一個函式正在寫入,./myFile.js第二個函式試影像這樣匯入檔案:
var fs = require('fs');
const myFile = require('./myFile')
async function writeMyFile() {
return new Promise((resolve, reject) => {
fs.promises.readFile('./myFile.js', 'utf8').then((file) => {
const replacedData = file 'newLine'
fs.promises
.writeFile('./myFile.js', replacedData)
.then(() => resolve('Writted'))
.catch(() => reject('Error'));
});
});
}
function importMyFile() {
console.log(myFile) // this is always empty
}
await writeMyFile()
importMyFile()
問題是我可以看到myFile寫得正確,但我在importMyFile函式中看不到它。當我分別嘗試這些功能時,它可以作業(先執行第一個,然后再執行第二個)
我嘗試了以下方法:
- 使用庫中的
promise函式fs:fs.promises.readFile()和fs.promises.writeFile()(上面的例子) - 回傳一個在
writeMyFile結束時解決的 Promise 。(上例) - 在
readMyFile函式中直接匯入檔案,如下所示:
function importMyFile() {
const myFile = require('./myFile')
console.log(myFile) // this is always empty
}
- 沒有像這樣回傳新的 Promise:
async function writeMyFile() {
const file = await fs.promises.readFile('./myFile.js', 'utf8')
const replacedData = file 'newLine'
await fs.promises.writeFile('./myFile.js', replacedData)
}
我還看到在控制臺中,日志的順序是:
'Writted'
{} //empty file
請記住,這是我案例的簡化版本。
編輯我正在嘗試撰寫和匯入的檔案始終如下所示:
module.exports = []
它被填充,它看起來像這樣:
const myModule = {
name: 'name',
surname: 'surname'
}
module.exports = [myModule]
我希望有人知道這里發生了什么。謝謝!
uj5u.com熱心網友回復:
使用require不同于readFile. Usingrequire將 .js 檔案作為模塊加載并引入其匯出的元素以在您的代碼中使用。如果您只是對列印 .js 檔案中的文本感興趣,那么請使用fs.readFileSync它(如果您使用呼叫的同步版本,則不需要承諾)。
您擁有的代碼會將字串“newLine”添加到檔案的末尾,但如果您的意圖是添加實際的換行符,則應該添加“\n”。
代碼的更簡單版本可能如下所示:
function writeMyFile() {
const file = fs.readFileSync('./myFile.js', 'utf8');
const replacedData = file '\n';
fs.writeFileSync('./myFile.js', replacedData);
return 'Written';
}
function importMyFile() {
// actually read the file instead of using require()
const file = fs.readFileSync('./myFile.js', 'utf8');
console.log(file);
}
writeMyFile()
importMyFile()
由于沒有進行異步呼叫,因此不需要承諾或等待。
如果您確實打算在其中使用 .js 代碼,并且使用很重要,require那么請注意,一旦您以這種方式將其加載到記憶體中,它在磁盤上的檔案更改后不會重繪 。即使你require以后再打電話,它也會聰明地說“哦,我已經在記憶體中了那個”而不是重新加載它。因此,請延遲呼叫,require('./myFile')直到進行任何必要的更改并將require陳述句放入importMyFile().
uj5u.com熱心網友回復:
await writeMyFile()
importMyFile()
必須在異步函式內。
例如,像這樣呼叫它們,這應該可以作業。
(async ()=>{
await writeMyFile()
importMyFile()
})()
此外,輸出 {} 表示沒有從 myfile.js 匯出的模塊。
編輯:“myFile”變數包含舊資料。因為它是在執行開始時匯入的。本importMyFile應該重新匯入myfile.js。
function importMyFile() {
myFile = require('./myFile')
console.log(myFile)
}
在此之后writeMyFile,如果函式更改了myfile.js匯出,則的新更改將顯示在控制臺中。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/383079.html
標籤:javascript 节点.js 异步 异步等待 FS
