Firebase 异步函数中的异步操作
例如,假设我在initState中调用一个函数,该函数从Firebase集合中获取一些文档。我正在使用async forEach对这些文档进行迭代,需要执行等待操作,从firebase的另一个集合中获取一些数据,并将它们保存在列表中,然后在forEach完成后返回。但是当第二个等待函数在return语句之后完成时,返回的列表是空的。我该怎么处理?我很难理解异步编程,因此请详细解释,我们将不胜感激 这里的代码只是一个显示实际场景的示例代码Firebase 异步函数中的异步操作,firebase,flutter,asynchronous,dart,async-await,Firebase,Flutter,Asynchronous,Dart,Async Await,例如,假设我在initState中调用一个函数,该函数从Firebase集合中获取一些文档。我正在使用async forEach对这些文档进行迭代,需要执行等待操作,从firebase的另一个集合中获取一些数据,并将它们保存在列表中,然后在forEach完成后返回。但是当第二个等待函数在return语句之后完成时,返回的列表是空的。我该怎么处理?我很难理解异步编程,因此请详细解释,我们将不胜感激 这里的代码只是一个显示实际场景的示例代码 Future getList() async {
Future getList() async {
//These are just example refs and in the actual refs it does print actual values
var collectionOneRef = Firestore.instance.collection('Collection1');
var collectionTwoRef = Firestore.instance.collection('Collection2');
List<Map<String, dynamic>> properties = [];
QuerySnapshot querySnapshot = await collectionOneRef
.getDocuments()
.then((query) {
query.documents.forEach((colOneDoc) async {
var colOneID = colOneDoc.documentID;
await collectionTwoRef.document(colOneID).get().then((colTwoDoc) {
Map<String, dynamic> someMap = {
"field1": colTwoDoc['field1'],
"field2": colTwoDoc['field2']
};
properties.add(someMap);
properties.sort((p1, p2) {
//sorting based on two properties
var r = p1["field1"].compareTo(p2["field1"]);
if (r != 0) return r;
return p1["field2"].compareTo(p2["field2"]);
});
print(properties); //this prints actual data in it
));
});
});
});
print(properties); //This prints a blank list as [] and obviously returns blank list
return properties;
}
Future getList()异步{
//这些只是示例参考,在实际参考中,它会打印实际值
var collectionOneRef=Firestore.instance.collection('Collection1');
var collectionTwoRef=Firestore.instance.collection('Collection2');
列表属性=[];
QuerySnapshot QuerySnapshot=等待收集能量ef
.getDocuments()
.然后((查询){
query.documents.forEach((colOneDoc)异步{
var colOneID=colOneDoc.documentID;
等待collectionTwoRef.document(colOneID.get()。然后((colTwoDoc){
映射someMap={
“field1”:colTwoDoc['field1'],
“field2”:colTwoDoc['field2']
};
添加(someMap);
properties.sort((p1,p2){
//基于两个属性的排序
变量r=p1[“字段1”]。与(p2[“字段1”])相比;
如果(r!=0)返回r;
返回p1[“field2”]。与(p2[“field2”])进行比较;
});
打印(属性);//这将打印其中的实际数据
));
});
});
});
print(properties);//将空白列表打印为[],并明显返回空白列表
归还财产;
}
现在,当我在有状态小部件的initState中调用这个函数并在某处显示它时,它会显示一个空白列表。但是,在我“热重新加载”之后,它会显示出来。我想获取数据并显示它,而不需要重新加载数据。提前感谢听起来您需要在调用
getList()
的代码块中等待整个函数本身
您正在异步并在函数内部等待,这看起来很好,这就是为什么在热重新加载时会得到结果。但在这种情况下,您可能没有在调用此函数的代码中真正等待整个函数本身。请检查。听起来您需要在调用
getList()
的代码块中等待整个函数本身
您正在异步并在函数内部等待,这看起来很好,这就是为什么在热重新加载时会得到结果。但在这种情况下,您可能没有在调用此函数的代码中真正等待整个函数本身。请检查。请添加一些代码。这听起来像是foreach循环的问题,而不是异步await@SweetChillyPhilly补充。。请看一下:)请添加一些代码。这听起来像是foreach循环的问题,而不是异步await@SweetChillyPhilly补充。。请看一看:)我正在initState中调用此函数,正如我提到的,我不应该等待它,这也不是一个好的做法。我认为这就是你的问题所在,请尝试使用生命周期挂钩。这可能会有所帮助。我还需要在构建方法中显示此列表。根据许多SOF专家的说法,异步或等待构建方法不是一个好的实践。我唯一能称之为这个的地方是initState,在那里它不应该被等待。如果我在这些陈述中有任何错误,请纠正我。谢谢我不认为你必须让它处于initstate状态,为什么你不能在他们访问你的页面时获取你的数据,并让它在BeforeMounted()函数中运行,这样它就会在加载页面之前开始处理,然后你会在它等待时显示一个加载图标。商店最好会发送此事件。这些是我的想法这里的代码是dart代码颤振框架。我认为您提到的BeforeMounted()来自Javascript。。Dart/Flutter中是否存在类似的情况?我在initState中调用此函数,正如我所提到的,我不应该等待它,这也不是一个好的实践。我相信这就是你的问题所在,请尝试使用生命周期挂钩。这可能会有所帮助。我还需要在构建方法中显示此列表。根据许多SOF专家的说法,异步或等待构建方法不是一个好的实践。我唯一能称之为这个的地方是initState,在那里它不应该被等待。如果我在这些陈述中有任何错误,请纠正我。谢谢我不认为你必须让它处于initstate状态,为什么你不能在他们访问你的页面时获取你的数据,并让它在BeforeMounted()函数中运行,这样它就会在加载页面之前开始处理,然后你会在它等待时显示一个加载图标。商店最好会发送此事件。这些是我的想法这里的代码是dart代码颤振框架。我认为您提到的BeforeMounted()来自Javascript。。在飞镖/颤振中有类似的东西吗?