Я использую javascript, и когда я нажимаю элементы, массив возвращает длину 0 и регистрируется как пустой, но когда я расширяю его, он покажет, что в нем есть элементы.
код:
async function asyncForEach(array, callback) {
for (let index = 0; index < array.length; index++) {
await callback(array[index], index, array)
}
}
asyncForEach(image, imageUpload => {
RNFetchblob.fetch('POST', SERVICE_URL + 'uploadImage.php', {
Authorization : "Bearer access-token",
otherHeader : "foo",
'Content-Type' : 'multipart/form-data',
}, [
{ name : 'image', filename : 'image.png', type:'image/png', data: imageUpload.data},
]).then((resp) => {
const response = Object.values(resp)
response.forEach(img => images.push(img))
}).catch((err) => {
})
})
console.info(images)
Вы регистрируете массив длинный до того, как он будет заполнен элементами. Еще рекомендую посмотреть Promise.all().
@ChrisG, я пробовал, но не работает.
@ سجادحيدر Покажите, что вы пробовали, чтобы мы могли указать на ошибку, которую вы сделали.
@ سجادحيدر Мое предложение: pastebin.com/aLm2SqpG
@ChrisG, я сделал это, спасибо



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Созданная вами функция является асинхронной, но основной код, который ее вызывает, - нет. Ваш asyncForEach возвращает обещание, а код продолжает выполняться.
Вам нужно поместить команду регистрации в .then(), прикрепленную к ее результату, или сделать вашу внешнюю функцию асинхронной, что в основном то же самое.
Другая проблема заключается в том, что вы ждете своих обещаний в цикле, что означает, что вы не начнете загружать второе изображение, пока не будет завершено первое, и т. д. Гораздо лучшая альтернатива - создать массив обещаний и передать их в Promise.all:
Promise.all(image.map(imageUpload => RNFetchblob.fetch(...).then(...))
.then(() => console.info(images));
(Одно предостережение заключается в том, что если одна из загрузок не удалась, обещание будет немедленно отклонено и напечатает результаты, собранные до сих пор, которые могут быть пустыми. Обратите внимание, что оставшиеся загрузки все равно будут выполняться, поэтому это влияет только на вывод консоли. Это может можно избежать, добавив предложение .catch после then, но убедитесь, что вы каким-то образом уведомили себя об ошибке.)
спасибо, но это больше не асинхронно.Я пытаюсь загрузить изображения, получить имя изображения, а затем добавить элемент в базу данных с именем изображения, переданным с массивом imgur.com/a/dEzJRqw
Он по-прежнему асинхронный. Использование async / await - это просто альтернативный синтаксис для обещаний, логика все та же.
Вторая строка должна быть .then(images => console.info(images));
Он запускает все загрузки одновременно (или несколько раз, в зависимости от того, как браузер решит это сделать) и заполняет массив по завершении загрузки. Он эквивалентен вашему исходному коду, за исключением одновременной части - при условии, что вам действительно не нужно, чтобы он был последовательным по какой-либо причине.
Да, и если одна из загрузок завершится неудачно, массив будет распечатан немедленно, вы можете добавить catch после then, чтобы избежать этого.
Теперь данные будут добавлены после завершения загрузки, я сделал это, вы спасли мне день, большое вам спасибо!
@Taplar Отредактировано!