Альтернатива вложенным обещаниям

#javascript #es6-promise

#javascript #es6-обещание

Вопрос:

Я пытаюсь создать функцию, которая получает предварительно указанный URL-адрес s3 (вызов 1) и выполняет отправку в s3. Единственный способ, которым я могу понять это в своей голове, — это использовать вложенное обещание, которое, как я понимаю, является антишаблоном.

Записываю это в js / псевдокоде

 uploadfile(file){
  return new Promise((resolve, reject) => {
    axios.get(get-presigned-s3url).then((url) =>{ return axios.put(file)}
  })
}

let filePromises = files.forEach(file => uploadfile(file));
promises.all((filePromises) => notifyUpload(filePromises));
  

Мне нужно вернуть обещание из функции uploadfile, чтобы дождаться разрешения всех обещаний. Как правильно справиться с этим сценарием?

Комментарии:

1. что вы делаете с url результатом обещания axios.get() ?

2. подсказка: что axios.put возвращает?

3. вы понимаете, uploadfile возвращает обещание, которое никогда не выполняется … просто return axios.get(..... нет необходимости переносить функцию, которая возвращает обещание, в конструктор обещаний

4. также … array.forEach ВОЗВРАТ undefined …. вы хотите array.map

Ответ №1:

Поскольку axios.get обещание уже возвращается, вам не нужно создавать другое вокруг него с помощью new Promise .

files.forEach не будет работать, потому что forEach возвращает undefined . Используйте .map вместо этого, чтобы у вас был массив обещаний.

 const uploadFile = file => axios.get(url)
    .then((url) => { return axios.put(file); });
  
 Promise.all(
  files.map(uploadFile)
)
  .then(notifyUpload)
  .catch(handleErrors);
  

Комментарии:

1. Спасибо! Это было чрезвычайно полезно. (Я немного боролся с тем, чтобы обернуть мою голову вокруг обещаний!)