[英]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.