УДАЛИТЬ ФАЙЛЫ с Node.js - PullRequest
1 голос
/ 07 мая 2020

Я пытаюсь удалить несколько файлов, а затем показываю сообщение.

ОЖИДАЕМЫЙ ВЫХОД

File deleted

Folder Cleared!!!

ФАКТИЧЕСКИЙ ВЫХОД

Folder Cleared!!!

File deleted

Текущий код:

function clearConverted() {
      const resp = new Promise(async (resolve) => {

        const converted = glob.sync('./converted/*.mp4');


        if (converted.length) {
          const fs = require('fs');
          const promises = converted.map(v => {

            fs.unlink(v, () => console.log('File deleted'))
          })
          Promise.all(promises);
        } else {
          console.log('No files to delete');
        }
        resolve();
      })
      resp.then(console.log('Folder Cleared!!!'))
    }

Вы можете мне помочь?

Ответы [ 2 ]

2 голосов
/ 07 мая 2020

Согласно моим исходным комментариям к вашему вопросу, у вас есть куча, которую нужно исправить с помощью вашего кода -

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 и обещаниями. Эти дополнительные примеры кода могут помочь предоставить дополнительную информацию -

0 голосов
/ 07 мая 2020

Когда вы вызываете там метод Promise.all add .then, что-то вроде этого:

Promise.all(promises).then((response) => console.log("Folder Cleared")).catch((error) => console.log(error)) 

А также, когда вам требуются модули или зависимости, вы объявляете их в верхней части файла, а не внутри функций или петли.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...