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

时间:2019-02-25 15:06:55

标签: dart flutter google-cloud-firestore future dart-async

简短:$ ./a.out A construct:0x781b68 1 2 AutoPtr destruct: 0x781b68 A destruct:0x781b68 AutoPtr destruct: 0x781b68 A destruct:0x781b68 toList()执行之前,导致makeMaker具有markers个对象。

:在Firestore中,我有nulltable集合,并且在game的内部有一个table字段(type =参考)。使用game,我可以访问StreamBuilder。然后,我遍历table,并尝试通过使用table在其game字段中填充真实数据,如下所示;

get

由于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()之前执行。

如果从Firestore返回了3个标记,则我们的markers是3个markers null的数组。我认为marker最有可能尚未执行。

是否有一种让makeMarker(..)方法等待map完成然后用非空值初始化get数组的方法?或者您可以告诉我另一种方法来完成我想要的事情。

1 个答案:

答案 0 :(得分:2)

您可以使用

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;
  });