Цикл 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);