如何正确调用等待?

Posted

技术标签:

【中文标题】如何正确调用等待?【英文标题】:How to call await correctly? 【发布时间】:2019-08-27 23:00:15 【问题描述】:

我是 Flutter 和 Dart 的新手。我有以下代码:

class ItemRepository 

  final Firestore _firestore = Firestore.instance;

  Future<List<Item>> loadItems() async 
    List<Item> itemList = [];
    _firestore.collection('items').snapshots().listen((data) 
      data.documents.forEach((doc)
        print("------- KODE: $doc['kode']");
        itemList.add(Item(doc['kode'], doc['name']));
      );
    );
    return itemList;
  

当我使用以下代码拨打我的loadItems 时:

Stream<ItemState> _mapLoadItemsToState() async* 
    try 
      final data = await this.repo.loadItems();
      print('-------------------------------');
      print(data.length);
     catch(e) 
      print(e.toString());
    
  

无需等待从 Firebase 返回数据。我将await 添加到_firestore.collection('items').snapshots() 但没有运气。

有什么想法吗? 感谢您的任何建议。抱歉英语不好。

【问题讨论】:

【参考方案1】:

那是因为您正在收听数据,您需要先获取 Future&lt;QuerySnapshot&gt; 然后再获取 documents 。 试试这样的:

Future<List<Item>> loadItems() async 
   final List<Item> itemList = (await Firestore.instance.collection('items').getDocuments()).documents.map((snapshot) => Item(doc['kode'], doc['name'])).toList();
   return itemList;

【讨论】:

以上是关于如何正确调用等待?的主要内容,如果未能解决你的问题,请参考以下文章

如何从同步方法调用中回调而不等待它?

如何在.NET中调用异步函数而不等待它[重复]

在 Alamofire 中,等待一组调用完成的正确方法是啥?

等待网络呼叫完成的正确性 - iOS

等待异步函数在 dart 中无法正确执行

如何让异步/等待等待我的嵌套数组填充