以异步方式使用 .map()、.where() 等迭代助手?
Use iteration helpers like .map(), .where(), etc in an async manner?
短: toList()
在 makeMaker
之前执行导致 markers
有 null
个对象。
Long: 在 Firestore 中,我有 table
和 game
集合,在 table
里面,有一个 game
字段(类型=参考)。使用 StreamBuilder
,我可以访问 table
。然后我遍历 table
s 并尝试使用 get
用真实数据填充它们的 game
字段,如下所示;
if (snapshot.hasData) {
tabledocs = snapshot.data.documents;
markers = tabledocs
.map((tabledoc) {
DocumentReference gameref = tabledoc.data['game'];
//game field is a reference type field which points to another collection
gameref.get().then((gdoc) {
tabledoc.data['game'] = gdoc;
Marker marker = makeMarker(tabledoc); //<--------Executes later
return marker;
});
}).toList(); //<--------Executes first
}
因为gameref.get().then()
需要时间,底部的toList()
在每个标记生成并添加到markers
之前执行。
如果从 Firestore 返回了 3 个标记,我们的 markers
是一个包含 3 null
marker
的数组。我想 makeMarker(..)
很可能还没有执行。
有没有办法让 map
方法等待 get
完成,然后用非空值初始化 markers
数组?或者你能告诉我另一种方法来完成我想要的。
您可以使用
await for(var tabledoc of tabledocs) {
}
或者如果不需要按顺序执行项目(尽管结果将按照原始项目的顺序)
var markers = await Future.wait(tabledocs
.map((tabledoc) {
DocumentReference gameref = tabledoc.data['game'];
//game field is a reference type field which points to another collection
var gdoc = await gameref.get();
tabledoc.data['game'] = gdoc;
Marker marker = makeMarker(tabledoc);
return marker;
});
短: toList()
在 makeMaker
之前执行导致 markers
有 null
个对象。
Long: 在 Firestore 中,我有 table
和 game
集合,在 table
里面,有一个 game
字段(类型=参考)。使用 StreamBuilder
,我可以访问 table
。然后我遍历 table
s 并尝试使用 get
用真实数据填充它们的 game
字段,如下所示;
if (snapshot.hasData) {
tabledocs = snapshot.data.documents;
markers = tabledocs
.map((tabledoc) {
DocumentReference gameref = tabledoc.data['game'];
//game field is a reference type field which points to another collection
gameref.get().then((gdoc) {
tabledoc.data['game'] = gdoc;
Marker marker = makeMarker(tabledoc); //<--------Executes later
return marker;
});
}).toList(); //<--------Executes first
}
因为gameref.get().then()
需要时间,底部的toList()
在每个标记生成并添加到markers
之前执行。
如果从 Firestore 返回了 3 个标记,我们的 markers
是一个包含 3 null
marker
的数组。我想 makeMarker(..)
很可能还没有执行。
有没有办法让 map
方法等待 get
完成,然后用非空值初始化 markers
数组?或者你能告诉我另一种方法来完成我想要的。
您可以使用
await for(var tabledoc of tabledocs) {
}
或者如果不需要按顺序执行项目(尽管结果将按照原始项目的顺序)
var markers = await Future.wait(tabledocs
.map((tabledoc) {
DocumentReference gameref = tabledoc.data['game'];
//game field is a reference type field which points to another collection
var gdoc = await gameref.get();
tabledoc.data['game'] = gdoc;
Marker marker = makeMarker(tabledoc);
return marker;
});