簡體   English   中英

使用 NodeJS FS mkdir 時,包含回調的重要性是什么?

[英]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() ,它返回一個解決/拒絕的承諾,而不是使用普通的回調。 這允許您將awaittry/catch.catch() .then().catch()而不是使用簡單的回調來了解何時完成,並且 promise 通常可以更輕松地與其他異步操作進行排序並集中錯誤處理。

因為mkdirasync

例子:

如果你這樣做:

fs.mkdir('test');
fs.statSync('test').isDirectory();//might return false cause it might not be created yet

但如果你這樣做:

fs.mkdir('test', function() {
    fs.statSync('test').isDirectory();//will be created at this point
});

如果您需要sync版本,您仍然可以使用mkdirSync

使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM