0

我正在使用 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)

4

2 回答 2

1

而不是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);
}();
于 2020-11-22T19:39:20.303 回答
0
(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);
于 2020-11-22T19:32:06.123 回答