Reactjs 等待循环需要时间才能得到结果

Reactjs 等待循环需要时间才能得到结果,reactjs,react-native,async-await,es6-promise,for-await,Reactjs,React Native,Async Await,Es6 Promise,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()) } s

我正在使用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);
}();
当我在emulator中运行应用程序时,数组包含2项,它只会按预期给出结果,但当数组大于40或第n个数字时,结果不会更新为expected,几分钟后,显示预期结果。 我只想更新isLoading state false,当for wait循环完成其循环并且循环块内的代码完成对firebase的检查时,则仅更新setIsLoading(false)

您可以考虑使用,并等待所有操作完成。

根据之前的建议,最好将其分解为块,并使用where('value','in',array)代替

更新-用于循环(我将它们分解为步骤,以便您可以修改以供自己使用)

//创建一个函数
const myJob=async()=>doSomething
//空数组以容纳所有异步作业。
让我的承诺=[]
//让loop做你想做的任何事情。
对于(变量i=0;i<10;i++){
我的承诺。推(我的工作(我));
}
//现在打电话给Promise.all和一系列工作
const myResults=Promise.all(myPromises);

对于wait使用
wait
而不是
,对于
get()
函数使用

这应该管用

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

在循环中生成网络请求是个坏主意。非常非常慢。将其批处理为单个请求。是的,但是如果数组大小超过10,那么它将无法工作,我也尝试了使用array.slice,但同样的结果也出来了。我可以知道您想要实现什么吗?我看到的是你得到了价值观却什么都没做。在大多数真实世界的用例中,不需要以这种方式循环所有记录。如果你是这样做的,那么就需要重新审视你的数据设计我想知道的是,有一个50+的电子邮件数组,我想在电子邮件中循环并匹配用户文档,其中email==数组中的电子邮件,如果有文档,则有一个useState钩子,可以使用previousstate方法更新该钩子,并在该状态下添加值…将其拆分为10个数组,并在循环中使用where值。这样你只需要打5次电话,而不是50次。无论它是firebase还是任何其他数据库都无关紧要。连续调用api 50次,意味着50次数据库调用,50次网络开销等。每次调用只会以指数级的速度变慢。感谢您的回答,我已经尝试过了,但在使用in子句时,我面临的问题是,如果有50封电子邮件,for循环将按预期运行,但设置为加载的代码(false)所有5条记录在异步请求中之前的触发器。。。
//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);
(async () => {
  for (const element of array) {
    const snapshot = await firestore().collection('users').where('value', '==', element).get();
    setvalue(snapshot.data());
  }
  setIsLoading(false);
}();