Rom*_*dez 2 asynchronous file node.js async-await
我正在尝试删除一些文件,然后显示一条消息。
预期产出
File deleted
Folder Cleared!!!
Run Code Online (Sandbox Code Playgroud)
实际产量
Folder Cleared!!!
File deleted
Run Code Online (Sandbox Code Playgroud)
当前的代码是:
File deleted
Folder Cleared!!!
Run Code Online (Sandbox Code Playgroud)
你可以帮我吗?
根据我对你的问题的最初评论,你的代码有很多需要修复的地方 -
require
在循环内使用const { unlink } =
require("fs").promises // <-- fsPromises
function clearConverted() {
const converted =
glob.sync("./converted/*.mp4")
if (converted.length === 0)
return Promise.resolve([])
const promises =
converted.map(v => unlink(v).then(_ => v))
return Promise.all(promises)
}
clearConverted() // <-- returns a promise!
.then(deletedFiles => console.log("done! deleted files:", deletedFiles))
// done! deleted files: ./converted/foo.mp4, ./converted/bar.mp4
Run Code Online (Sandbox Code Playgroud)
看看我们如何消除console.log
函数的副作用?这允许我们的函数收集有意义的数据,例如文件名,并返回已删除文件的列表。因为console.log
效果现在已经超出了我们的范围clearConverted
,如果我们愿意的话,我们可以改变它。
例如,我们可以在一个不太冗长的程序中简单地显示已删除文件的数量 -
clearConverted()
.then(deletedFiles =>
console.log("done! deleted %d files.", deletedFiles.length)
)
// done! deleted 9 files.
Run Code Online (Sandbox Code Playgroud)
我们还可以做得更多。现在一个明显的改进是创建clearConverted
一个接受path
作为参数的通用函数 -
function unlinkFiles (path = "") { // <-- generic name and path parameter
const files =
glob.sync(path)
if (files.length === 0)
return Promise.resolve([])
else
return Promise.all(files.map(f => unlink(f).then(_ => f)))
}
unlinkFiles("./converted/*.mp4") // <-- supply path at call site
.then(deletedFiles => console.log("done! deleted files:", deletedFiles))
.catch(console.error) // <-- don't forget to catch Promises too
Run Code Online (Sandbox Code Playgroud)
现代功能async
让我们可以跳过一些围绕 Promise 的仪式 -
async function unlinkFiles (path = "") { // <-- async keyword
const files =
glob.sync(path)
return files.length === 0
? [] // <-- automatically wrapped in a Promise
: Promise.all(files.map(f => unlink(f).then(_ => f)))
}
Run Code Online (Sandbox Code Playgroud)
现在,如果您愿意,您可以使该函数接受glob
结果而不是path
-
const unlinkFiles = async (files = []) => // <-- arrow function
files.length === 0
? []
: Promise.all(files.map(f => unlink(f).then(_ => f)))
unlinkFiles(glob.sync("./converted/*.mp4")) // <-- use glob as input
.then(console.log, console.error)
Run Code Online (Sandbox Code Playgroud)
当您理清电线时,编程就会变得有趣而简单。可悲的是,像 JavaScript 这样的语言也很容易搬起石头砸自己的脚,所以在启蒙之前有很多痛苦。
我还有涉及模块和承诺的其他答案fs
。这些额外的代码示例可能有助于提供额外的见解 -