以异步方式使用 .map()、.where() 等迭代助手?

Use iteration helpers like .map(), .where(), etc in an async manner?

短: toList()makeMaker 之前执行导致 markersnull 个对象。

Long: 在 Firestore 中,我有 tablegame 集合,在 table 里面,有一个 game 字段(类型=参考)。使用 StreamBuilder,我可以访问 table。然后我遍历 tables 并尝试使用 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;
  });