【发布时间】:2019-05-28 23:40:44
【问题描述】:
我在 javascript 中编写了一个递归 Promise,它似乎工作正常,但我想使用 setTimeout() 对其进行测试,以确保在继续执行之前我正在等待正确。这是我的代码的要点:
try{
await renameFiles(); // <-- await here
console.log("do other stuff");
}
catch(){
}
const renameFiles = (path) => {
return new Promise(resolve => {
console.log("Renaming files...");
fs.readdirSync(path).forEach(file) => {
// if file is a directory ...
let newPath = path.join(path, file);
resolve( renameFiles(newPath) ); // <- recursion here!
// else rename file ...
}
resolve();
})
我已经像这样使用 setTimeout() 对其进行了测试:
const renameFiles = () => {
return new Promise(resolve => {
setTimeout(() => {
// all previous code goes here
},2000)
}
}
输出是:
"Renaming files..."
"Renaming files..."
// bunch of renaming files...
"do other stuff"
"Renaming files..."
"Renaming files..."
所以看起来它正在等待一段时间,但它会在某个时间点继续执行。
我也怀疑我测试错了。知道问题出在哪里吗?
【问题讨论】:
-
你多次调用
resolve,这是没有意义的。根据the spec,只有第一个分辨率很重要:If the associated promise has already been resolved, either to a value, a rejection, or another promise, this method does nothing. -
将 Promise 收集到一个数组中并等待 Promise.all(arrayOfPromises)
-
我认为@AlexanderAzarov 发现了这个问题。
renameFiles提前解决,异步函数继续,而递归也继续。可能只需删除resolve(renameFiles(newPath))并仅放置renameFiels(newPath)即可修复它。 -
@MichaelSorensen 我已经尝试不使用
resolve(renameFiles(newPath)),但它没有解决它
标签: javascript recursion promise async-await