簡體   English   中英

異步功能-這是“回調地獄”嗎?

[英]Asynchronous Functions - Is this 'callback hell'?

我對節點的了解越來越多,最大的問題是弄清異步函數是如何工作的。

fs.readdir(base, function (err, files) {
    if (!files.length) {
        console.log('No files');
    }
    for (var i in files) {
        fs.stat(files[i], function (err, stats) {
            if (stats.isDirectory()) {
                console.log(files[i]);
                console.log('FOLDER');
            } else {
                console.log(files[i]);
                console.log('FILE')
            }
        })
    }
});

base是一個文件夾,其中包含兩個子文件夾,以及一個.DS_Store文件。 命令行的輸出將是:

.DS_Store
FILE
/dir/to/file/index.js:115
      if (stats.isDirectory()) {
               ^

TypeError: Cannot read property 'isDirectory' of undefined

我現在的基本理解是存在此問題,因為它都是異步發生的-我最好的猜測是readdir回調不“等待” fs.stat回調完成? 我可能完全誤會了它(實際上,從中獲得基本了解的任何好的文檔都將有所幫助)。

我的下一個想法是像諾言? 他們似乎解決了異步問題,因此這將是我學習的下一個飛躍。

這是“回調地獄”嗎? 承諾是否解決? 有其他方法可以做到這一點嗎?

根據您其余的代碼,這里可能存在一些問題。 一個是fs.stat將路徑作為第一個參數而不是文件名。 如果您將函數調用更改為fs.stat(base + '/' + files[i], function (err, stats)可能會有所幫助,但我不確定您的示例中的base是什么。

其次,您應該在循環中使用ES6 let而不是var 異步函數將放置在調用堆棧上,並在完成后按順序進行處理。 但是,到那時,循環將一直貫穿整個過程,並且變量i將等於上一次迭代中的值。 另一方面,用let定義的變量在范圍上僅限於一個塊,這意味着每個函數由於位於單獨的塊中,因此具有正確的i值。

嘗試測試如下所示的兩個不同版本,首先使用for (var i in files) ,然后使用for (let i in files) ,您將明白我的意思。

for (var i in files) {
        fs.stat(files[i], function (err, stats) {
            if (stats.isDirectory()) {
                console.log(files[i]);
                console.log('FOLDER');
                console.log(i);
            } else {
                console.log(files[i]);
                console.log('FILE')
                console.log(i);
            }
        })
    }

另外,如對您的問題的評論中所建議,我建議您進行適當的錯誤處理。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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