未来的 For 循环中的 Int 不会增加 Flutter/Firestore

Posted

技术标签:

【中文标题】未来的 For 循环中的 Int 不会增加 Flutter/Firestore【英文标题】:Int in a For loop inside future not incrementing Flutter/Firestore 【发布时间】:2021-11-11 16:05:25 【问题描述】:

我正在尝试使用 for 循环设置许多 Firestore 文档,并使用递增变量,但这个变量不像它那样递增... 这是代码

int debutRdv = 0;

).then((valueEnregistrement) => 
 for(PrestationSelected prestaSelect in prestaSelected)
  rdvService.createRdv(
   cli: cli, 
   debutRdv: debutRdv, 
   heureCreneau: heureCreneau, 
   prestaSelect: prestaSelect, 
   valueEnregistrement: valueEnregistrement
  )
  .then((valueRdv) => 
   for (int i = 0; i < prestaSelect.duree; i += 15)
    rdvService.createCreneau(
     debutRdv: debutRdv, 
     heureCreneau: heureCreneau, 
     i: i, 
     prestaSelect: prestaSelect, 
     valueRdv: valueRdv
    )
   ,
   debutRdv = debutRdv += prestaSelect.duree
   )
  ,

事实是变量首次亮相Rdv 并没有像我想要的那样递增。它在第二个循环 (createCreneau) 中正确递增,但在第一个循环 (createRdv) 中不正确。这就像函数 createRdv 在运行“then”之前运行的次数与我的列表 prestaSelected 的长度一样多...... 我真的不明白发生了什么。

例如结果应该是:

*debutRdv Rdv1 = 0  
debutRdv Rdv1Creneau 1 = 0  
debutRdv Rdv1Creneau 2 = 0  
debutRdv Rdv2 = 30  
debutRdv Rdv2Creneau 1 = 30  
debutRdv Rdv2Creneau 2 = 30*  

但它是:

*debutRdv Rdv1 = 0  
debutRdv Rdv1Creneau 1 = 0  
debutRdv Rdv1Creneau 2 = 0  
debutRdv Rdv2 = 0  
debutRdv Rdv2Creneau 1 = 30  
debutRdv Rdv2Creneau 2 = 30*  

请帮忙。

【问题讨论】:

只是一个建议:我发现 async/await 语法比 'then' 语法更容易调试和阅读。我建议进行此更改,因为您使用 For 循环嵌套了 Futures,这将很快变得复杂。 【参考方案1】:

问题:您的第一个 for-in 语句不会等待 rdvService.createRdv().then() 在移动到下一个项目之前完成,这会导致不确定(不可预测) 函数的执行顺序。

我不知道如何使用 then() 来做你想做的事情——我不确定它是否真的可能。您可以使用 async/await 而不是 then() 使用 for 或 for-in 来完成。 (当我需要 Dart 中的确定性迭代器以使用常规 for 循环(如第二个循环)时,我了解到。)如果您想尝试 async/await,有一个 article here 涵盖异步编程以及 for-in 和 forEach 循环。

【讨论】:

以上是关于未来的 For 循环中的 Int 不会增加 Flutter/Firestore的主要内容,如果未能解决你的问题,请参考以下文章

优化 Swift 中的嵌套 for 循环

golang for循环取值为啥不按顺序输出?

具有未知循环数的 Scala 未来

For-Each循环Java错误ArrayIndexOutOfBoundsException

如何从 python 3 中的 for 循环内部增加迭代器?

C++ 嵌套 for 循环,用于设置基数/指数的指数