【问题标题】:await not working for firebase querySnapshot, next line executed等待不适用于firebase querySnapshot,执行下一行
【发布时间】:2020-02-15 16:51:41
【问题描述】:

我有一个异步方法来返回带有条件的firebase查询的文档长度,并且已经在方法中使用await实现。代码如下。

/////////////////////

getUreadMsgCount(groupChatId, id).then((result) {
    unReadCount = result;
    print("COUNT WITHIN getUreadMsgCount Method : $unReadCount");
});

print("UNREAD OUTSIDE METHOD : $unReadCount");

////////////////////////////////

Future getUreadMsgCount(String groupId, String idFrom) async {
    var respectsQuery = Firestore.instance
        .collection('messages')
        .document(groupId).collection(groupId)
        .where('idFrom', isEqualTo: idFrom).where('isSeen', isEqualTo: 0);
    var querySnapshot = await respectsQuery.getDocuments();
    int totalUnread = querySnapshot.documents.length;
    return totalUnread;
}

////////////OUT PUT/////////////////////

I/flutter (28972): UNREAD OUTSIDE METHOD : 0
I/flutter (28972): UNREAD OUTSIDE METHOD : 0
I/flutter (28972): UNREAD OUTSIDE METHOD : 0
I/flutter (28972): COUNT WITHIN getUreadMsgCount Method : 2
I/flutter (28972): COUNT WITHIN getUreadMsgCount Method : 0
I/flutter (28972): COUNT WITHIN getUreadMsgCount Method : 0

如果你注意到,它总是首先执行 OUTSIDE METHOD 行,因此总是得到值为 0

我需要先从初始化的 getUreadMsgCount 方法中获取值,然后继续下一行。有什么帮助吗?

【问题讨论】:

    标签: firebase flutter dart google-cloud-firestore


    【解决方案1】:

    你需要使用await:

    var result = await getUreadMsgCount(groupChatId, id);
        unReadCount = result;
      print("COUNT WITHIN getUreadMsgCount Method : $unReadCount");
      print("UNREAD OUTSIDE METHOD : $unReadCount");
    

    这样,异步方法调用后的代码会在获取数据后执行。

    原因:

    getUreadMsgCount(groupChatId, id).then((result) {
        unReadCount = result;
        print("COUNT WITHIN getUreadMsgCount Method : $unReadCount");
      });
    
      print("UNREAD OUTSIDE METHOD : $unReadCount");
    
    

    没有按你的意愿打印,是因为getUreadMsgCount方法是异步的,所以then()方法后面的代码会先被执行,当数据全部取回后,then()方法里面的代码会被处决。

    https://dart.dev/codelabs/async-await#execution-flow-with-async-and-await

    【讨论】:

    • 很好的回答彼得。 @MobDev:关键是如果你不想使用await,那么所有需要数据的代码都必须then()回调中。
    • Peter, Frank 感谢您的回答,但另一个问题是父方法不是异步的,因此在调用该方法时我无法使用 await... 如何强制处理等待来自异步函数???
    • @MobDev 我需要一个异步函数,另一种方法就是像 Frank 所说的那样,在 then() 回调中添加所有需要数据的代码
    猜你喜欢
    • 2021-10-30
    • 2013-02-13
    • 2012-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-12
    • 1970-01-01
    • 2018-08-16
    相关资源
    最近更新 更多