我有一个目录,其中包含未知数量的子文件夹。每个子文件夹可能具有或没有其他子文件夹。我正在使用递归函数来遍历它们。由于子文件夹数量不明,我没有一种方法来确保在继续之前检查所有文件夹。我对异步和等待的了解非常有限。有什么办法可以解决这个问题?
function searchForPackage(directory){
fs.readdir(directory, function(err, files){
if(err){
return;
}else{
files.forEach(file => {
var currentLocation = directory + "/" + file;
if(fs.statSync(currentLocation).isDirectory() && file != 'bin' && file != '.bin'){
searchForPackage(currentLocation);
return;
}else if(file == "package.json"){
var content = fs.readFileSync(currentLocation);
var jsonContent = JSON.parse(content);
var obj = {
name: jsonContent.name,
license: jsonContent.license,
version: jsonContent.version
}
jsonTable.push(obj);
jsonTable.push({name: jsonContent.name, license: jsonContent.license, version: jsonContent.version});
return;
}
})
}
})
}
您有几种选择:
1)由于其他所有操作都使用fs
的同步方法完成,因此您可以更改fs.readdir
为fs.readdirSync
:
function searchForPackage(directory) {
fs.readdirSync(directory).forEach(file => {
var currentLocation = directory + "/" + file;
if (fs.statSync(currentLocation).isDirectory() && file != 'bin' && file != '.bin') {
searchForPackage(currentLocation);
return;
} else if (file == "package.json") {
var content = fs.readFileSync(currentLocation);
var jsonContent = JSON.parse(content);
var obj = {
name: jsonContent.name,
license: jsonContent.license,
version: jsonContent.version
}
jsonTable.push(obj);
jsonTable.push({name: jsonContent.name, license: jsonContent.license, version: jsonContent.version});
return;
}
})
}
2)转换fs.readdirSync
为a Promise
然后使用async/await
:
async function searchForPackage(directory) {
const files = await new Promise((resolve, reject) => {
fs.readdir(directory, (err, files) => {
if (err) reject(err);
else resolve(files);
});
});
await Promise.all(files.map(async file => {
var currentLocation = directory + "/" + file;
if (fs.statSync(currentLocation).isDirectory() && file != 'bin' && file != '.bin') {
await searchForPackage(currentLocation);
return;
} else if (file == "package.json") {
var content = fs.readFileSync(currentLocation);
var jsonContent = JSON.parse(content);
var obj = {
name: jsonContent.name,
license: jsonContent.license,
version: jsonContent.version
}
jsonTable.push(obj);
jsonTable.push({name: jsonContent.name, license: jsonContent.license, version: jsonContent.version});
return;
}
}))
}
3)使用几个第三方模块来进行一些清理(fs-extra
照顾像fs.readdir
您一样的异步方法。async- af
提供可链接的异步JavaScript方法,例如parallel
forEach
。):
const fs = require('fs-extra');
const AsyncAF = require('async-af');
async function searchForPackage(directory) {
await AsyncAF(fs.readdir(directory)).forEach(async file => {
var currentLocation = directory + "/" + file;
if (fs.statSync(currentLocation).isDirectory() && file != 'bin' && file != '.bin') {
await searchForPackage(currentLocation);
} else if (file == "package.json") {
var content = fs.readFileSync(currentLocation);
var jsonContent = JSON.parse(content);
var obj = {
name: jsonContent.name,
license: jsonContent.license,
version: jsonContent.version
}
jsonTable.push(obj);
jsonTable.push({name: jsonContent.name, license: jsonContent.license, version: jsonContent.version});
}
});
}
问题内容: 我正在尝试用Java倒计时。 这是我的HTML 而我的JS: 但是由于某种原因,它不会等待超时时间,而是立即执行,以便在刷新页面时立即显示“完成”。我知道它实际上被执行了多次,因为如果我这样做,它会从45开始递减计数。为什么会绕过超时? 问题答案: 执行带有该参数的函数,并将结果传递给。你不要那样 相反,执行一个匿名函数来调用您的函数:
我对Java线程和并发有点陌生。我读过关于同步和锁定块的书。它们让其他线程等待第一个线程完成其工作。 我只想知道一种方式,如果线程a正在执行它的执行,那么线程B不应该等待并跳过共享代码块的执行。
问题内容: 我需要在SQL Server 2012中将一列中的字符串拆分为一个字符,并将每个字符串拆分成它自己的列。 例如:如果我有一个栏,我需要把它拆分成,,,,,与每个这些转化为自己列。 要拆分的列的长度可能会有所不同,因此我需要使其尽可能地动态。 问题答案: 您可以这样做: 输出: 这是动态版本:
但ibatis会抛出以下错误: ...执行时出错:delimiter//drop函数if存在get_next_value_test//create函数get_next_value_test(p_name varchar(30))返回int deterministic sql security invoker begin declare current_val integer。原因:com.mysq
我想在拆分函数调用中使用空格作为分隔符,但我想在单个单元格数组中输入某些单词;例如。 例如: 在带有一些分隔符的函数拆分调用之后,输出应如下所示: 我需要找到一个分隔符(或正则表达式模式)用于split函数。我如何着手做那件事?
我在中写了这段代码 然后我尝试在另一个文件中使用它 我得到一个错误 “等待仅在异步函数中有效” 问题是什么?