Облачная асинхронная ожидание загрузки нескольких изображений одновременно, а затем сохранение в массиве в узле js - PullRequest
0 голосов
/ 25 июня 2018

Привет! Я ищу решение для загрузки на стороне сервера API с использованием функции ожидания asyc Node Js для загрузки нескольких изображений, а затем перехвата в массив. Я перехожу по этой ссылке , чтобы реализовать мой код. В консоли он показывает ожидаемый массив, но не дает никаких ответов.

Вот то, что я пробовал до сих пор,

exports.upload_image = async(req, res) =>{
  //let filePaths = req.files.path;

  let multipleUpload = new Promise(async (resolve, reject) => {
    let upload_len = req.files.length;
    let upload_res = new Array();

      for(let i = 0; i < upload_len; i++)
      {
          let filePath = req.files[i].path;
          await cloudinary.v2.uploader.upload(filePath, { use_filename: true, unique_filename: false }, function (error, result) {
              if(upload_res.length === upload_len)
              {
                /* resolve promise after upload is complete */
                resolve(upload_res)
              }
              else if(result)
              {
                /*push public_ids in an array */  
                upload_res.push(result.public_id);
              } else if(error) {
                console.log(error)
                reject(error)
              }

          })

      } 
  })
  .then((result) => result)
  .catch((error) => error)

  let upload = await multipleUpload;
  res.json({'response':upload})
}

Любое предложение будет оценено. Благодарю.

1 Ответ

0 голосов
/ 25 июня 2018

Я бы выбрал другой подход.Вы смешиваете обещания и async / await таким способом, который довольно трудно читать и отлаживать.

Я бы сделал это вместо этого: сопоставьте ваши файлы массиву обещаний, а затем вызовите Promise.all():

exports.upload_image = async(req, res) =>{
    // res_promises will be an array of promises
    let res_promises = req.files.map(file => new Promise((resolve, reject) => {
        cloudinary.v2.uploader.upload(file.path, { use_filename: true, unique_filename: false }, function (error, result) {
            if(error) reject(error)
            else resolve(result.public_id)
        })
    })
    )
    // Promise.all will fire when all promises are resolved 
    Promise.all(res_promises)
    .then(result =>  res.json({'response':upload}))
    .catch((error) => {/*  handle error */ })
}

Вот фрагмент кода с поддельной функцией загрузки и списком 'файлов':

function upload(file, fn) {
  // fake upload file, just return file as id
  setTimeout(() => fn(null, {
    public_id: file
  }), Math.floor(Math.random() * 500))
}

// fake req.files
let files = [1, 2, 3, 4, 5, 6]

let upload_image = () => {
  let upload_res = files.map(file => new Promise((resolve, reject) => {
    upload(file, (error, result) => {
      if (error) reject(error)
      else resolve(result.public_id);
    })
  }))

  Promise.all(upload_res)
    .then(result => console.log({
      'response': result
    }))
    .catch(error => error)

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