[英]When working with NodeJS FS mkdir, what is the importance of including callbacks?
我正在使用NodeJS REPL
控制台並遵循本教程。
http://www.tutorialspoint.com/nodejs/nodejs_file_system.htm
我專注於File System(FS)
模塊。 讓我們看看用於創建目錄的mkdir
函數。
根據 TutorialsPoint,這就是您使用 FS 創建目錄的方式
var fs = require("fs");
console.log("Going to create directory /tmp/test");
fs.mkdir('/tmp/test',function(err){
if (err) {
return console.error(err);
}
console.log("Directory created successfully!");
});
他們特別說你需要這個語法
fs.mkdir(path[, mode], callback)
好吧,我只是嘗試在沒有回調的情況下使用更少的代碼並且它起作用了。
var fs = require('fs');
fs.mkdir('new-directory');
並創建了目錄。 語法應該只是
fs.mkdir(path);
我不得不問,回調的目的是什么,你真的需要它嗎? 為了刪除目錄,我可以理解為什么您需要它,以防目錄不存在。 但是我看不出mkdir
命令可能出現什么問題。 似乎有很多不必要的代碼。
從節點 v10.0 開始,需要回調fs.mkdir()
。 你必須傳遞它,即使你只是傳遞一個什么都不做的虛擬函數。
回調的目的是讓你知道調用是否成功以及何時成功,如果沒有成功,具體的錯誤是什么。
請記住,這種類型的函數是異步的。 它在未來的某個未知時間完成,因此知道何時完成或是否成功完成的唯一方法是傳遞回調函數,當回調被調用時,您可以檢查錯誤並查看它是否已完成。
事實證明, mkdir()
肯定會出現一些問題,例如錯誤的路徑、權限錯誤等……因此肯定會發生錯誤。 而且,如果您想立即使用該新目錄,則必須等到回調被調用后再使用它。
作為對您的其他評論之一的回應,無論您是否傳遞回調, fs.mkdir()
函數始終是異步的。
下面是一個例子:
var path = '/tmp/test';
fs.mkdir(path, function (err) {
if (err) {
console.log('failed to create directory', err);
} else {
fs.writeFile(path + "/mytemp", myData, function(err) {
if (err) {
console.log('error writing file', err);
} else {
console.log('writing file succeeded');
}
});
}
});
注意:現代版本的 nodejs 包括fs.promises.mkdir()
,它返回一個解決/拒絕的承諾,而不是使用普通的回調。 這允許您將await
與try/catch
或.catch()
.then()
和.catch()
而不是使用簡單的回調來了解何時完成,並且 promise 通常可以更輕松地與其他異步操作進行排序並集中錯誤處理。
使用mkdir
可能會出錯,您可能應該處理異常和錯誤,並在可能的情況下將它們返回給用戶。
例如mkdir /foo/bar
可能會出錯,因為您可能需要root
(sudo) 權限才能創建頂級文件夾。
但是,回調背后的一般思想是您使用的方法是異步的,並且鑒於 Javascript 的工作方式,您可能希望在創建目錄后收到通知並繼續執行程序。
更新:請記住,如果您需要 - 假設 - 在目錄中保存文件,您將需要使用該回調:
fs.mkdir('/tmp/test', function (err) {
if (err) {
return console.log('failed to write directory', err);
}
// now, write a file in the directory
});
// at this point, the directory has not been created yet
我還建議您查看 Promise,它現在比回調使用得更頻繁。
因為它是一個異步調用,所以程序的進一步執行可能取決於操作的結果(目錄創建成功)。 回調執行時是第一個可以檢查的時間點。
然而,這個操作真的很快,它可能看起來是立即發生的,但實際上(因為它是異步的), fs.mkdir(path);
之后的以下行fs.mkdir(path);
將在不等待fs.mkdir(path);
任何反饋的情況下執行fs.mkdir(path);
因此沒有任何保證目錄創建已經完成,或者如果它失敗。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.