异步函数中的异步操作

时间:2020-07-05 20:55:15

标签: firebase flutter asynchronous dart async-await

对于一个实例,让我们假设我正在initState中调用一个函数,该函数从Firebase集合中获取一些文档。我正在使用async forEach迭代这些文档,并且需要执行await操作,以从firebase的另一个集合中获取一些数据,并将它们保存在列表中,然后在forEach完成后返回。但是,由于return语句之后的第二个await函数完成时,返回的列表为空。我该如何处理?我很难理解异步编程,因此请高度赞赏详细的解释。

这里的代码只是显示实际情况的示例代码。

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

现在,当我在有状态Widget的initState中调用此函数并将其显示在某处时,它将显示一个空白列表。但是,在“热重载”之后,它将显示。我想获取数据并显示它而不进行热重载。预先感谢

1 个答案:

答案 0 :(得分:0)

听起来像您需要在调用getList()的代码块中等待整个函数本身。

您正在函数内部进行同步和等待,这看起来不错,这就是为什么在热重载时获得结果的原因。但是可能是这样的情况,您实际上并没有在调用此代码的代码中等待整个函数本身。请检查。