Цикл For-await требует времени на результат

Я использую цикл for await для перебора массива и сопоставления значения внутри облака firestore, но, к сожалению, результат не соответствует ожиданиям; вот мой код

(async () => {
for await (const element of array) {
firestore().collection('users').where('value', '==', element).get()
.then(async snapshot () => {
setvalue(snapshot.data())
}
setIsLoading(false);
}();

Когда я запускаю приложение в эмуляторе, и массив содержит 2 элемента, он просто дает мне ожидаемый результат, но когда массив превышает 40 или n-е число, результат не обновляется как ожидаемый, и через несколько минут ожидаемый результат - отображение.Я просто хочу обновить состояние isLoading false, когда цикл for await завершает свой цикл, а также код внутри блока цикла завершил проверку firebase, тогда только setIsLoading(false)

2 ответа

Вместо for await, используйте await для тебя get()функция.
Это должно работать!

(async () => {
  for (const element of array) {
    const snapshot = await firestore().collection('users').where('value', '==', element).get();
    setvalue(snapshot.data());
  }
  setIsLoading(false);
}();
(async () => {

const allValues = await Promise.all(array.map( item => {

return firestore().collection('users').where('value', '==', element).get()
.then(async snapshot () => {
 //do something

 return value
}

})

console.log('allValues', allValues)
setIsLoading(false);
}();

Вы можете рассмотреть возможность использования Promise.all и дождаться завершения всех операций.

Как было рекомендовано ранее, лучше разбить его на куски и вместо этого использовать where('value','in', array).

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

//create a function
const myJob = async() => doSomething

//empty array to hold all the async jobs.
let myPromises = []

//for loop to do whatever u want.
for ( var i = 0; i < 10; i++) {
     myPromises.push(myJob(i));
}

//now call Promise.all with the array of jobs
const myResults = Promise.all(myPromises);
Другие вопросы по тегам