Согласно моим исходным комментариям к вашему вопросу, у вас есть куча, которую нужно исправить с помощью вашего кода -
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
А посмотрите, как мы удалили console.log
побочные эффекты из функции? Это позволяет нашей функции собирать значимые данные, такие как имена файлов, и возвращать список удаленных файлов. Поскольку эффект console.log
теперь за пределами из clearConverted
, мы можем изменить его, если мы будем sh.
Например, мы могли бы просто отобразить количество удаленных файлов, в менее подробной программе -
clearConverted()
.then(deletedFiles =>
console.log("done! deleted %d files.", deletedFiles.length)
)
// done! deleted 9 files.
И мы можем сделать больше. Очевидное улучшение - сделать clearConverted
универсальной функцией c, которая принимает 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
Современные функции, такие как async
, позволяют пропустить некоторые из церемония вокруг обещаний -
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)))
}
Теперь, если вы хотите, вы можете заставить функцию принимать результат 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)
Когда вы распутываете провода, программирование может быть забавным и простым. К сожалению, такие языки, как JavaScript, также позволяют легко выстрелить себе в ногу, поэтому до просветления будет много страданий.
У меня есть другие ответы, связанные с модулем fs
и обещаниями. Эти дополнительные примеры кода могут помочь предоставить дополнительную информацию -