#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. Спасибо! Это было чрезвычайно полезно. (Я немного боролся с тем, чтобы обернуть мою голову вокруг обещаний!)