Массив заполнен 4 элементами, но длина равна 0

Я использую 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)

@Taplar Отредактировано!

سجاد حيدر 03.07.2018 01:00

Вы регистрируете массив длинный до того, как он будет заполнен элементами. Еще рекомендую посмотреть Promise.all().

Chris G 03.07.2018 01:09

@ChrisG, я пробовал, но не работает.

سجاد حيدر 03.07.2018 01:15

@ سجادحيدر Покажите, что вы пробовали, чтобы мы могли указать на ошибку, которую вы сделали.

Chris G 03.07.2018 01:48

@ سجادحيدر Мое предложение: pastebin.com/aLm2SqpG

Chris G 03.07.2018 02:00

@ChrisG, я сделал это, спасибо

سجاد حيدر 03.07.2018 02:01
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
6
125
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Созданная вами функция является асинхронной, но основной код, который ее вызывает, - нет. Ваш asyncForEach возвращает обещание, а код продолжает выполняться.

Вам нужно поместить команду регистрации в .then(), прикрепленную к ее результату, или сделать вашу внешнюю функцию асинхронной, что в основном то же самое.

Другая проблема заключается в том, что вы ждете своих обещаний в цикле, что означает, что вы не начнете загружать второе изображение, пока не будет завершено первое, и т. д. Гораздо лучшая альтернатива - создать массив обещаний и передать их в Promise.all:

Promise.all(image.map(imageUpload => RNFetchblob.fetch(...).then(...))
  .then(() => console.info(images));

(Одно предостережение заключается в том, что если одна из загрузок не удалась, обещание будет немедленно отклонено и напечатает результаты, собранные до сих пор, которые могут быть пустыми. Обратите внимание, что оставшиеся загрузки все равно будут выполняться, поэтому это влияет только на вывод консоли. Это может можно избежать, добавив предложение .catch после then, но убедитесь, что вы каким-то образом уведомили себя об ошибке.)

спасибо, но это больше не асинхронно.Я пытаюсь загрузить изображения, получить имя изображения, а затем добавить элемент в базу данных с именем изображения, переданным с массивом imgur.com/a/dEzJRqw

سجاد حيدر 03.07.2018 01:40

Он по-прежнему асинхронный. Использование async / await - это просто альтернативный синтаксис для обещаний, логика все та же.

riv 03.07.2018 01:44

Вторая строка должна быть .then(images => console.info(images));

Chris G 03.07.2018 01:47

Он запускает все загрузки одновременно (или несколько раз, в зависимости от того, как браузер решит это сделать) и заполняет массив по завершении загрузки. Он эквивалентен вашему исходному коду, за исключением одновременной части - при условии, что вам действительно не нужно, чтобы он был последовательным по какой-либо причине.

riv 03.07.2018 01:56

Да, и если одна из загрузок завершится неудачно, массив будет распечатан немедленно, вы можете добавить catch после then, чтобы избежать этого.

riv 03.07.2018 01:58

Теперь данные будут добавлены после завершения загрузки, я сделал это, вы спасли мне день, большое вам спасибо!

سجاد حيدر 03.07.2018 02:00

Другие вопросы по теме