颤动:关于期货和异步函数的问题

问题描述 投票:0回答:1

关于在飞镖中使用Futures,我有几个问题。假设我正在使用firestore,我有一个这样的函数来更新用户的信息:

void updateOldUser(User oldUser,String newInfo){
DocumentReference userToUpdateRef = userRef.document(oldUser.id);
Firestore.instance.runTransaction((Transaction transaction) async {
DocumentSnapshot userToUpdateSnapshot = await transaction.get(userToUpdateRef);
  if(userToUpdateSnapshot.exists){
    await transaction.update(
      userToUpdateSnapshot.reference, userToUpdateSnapshot.data[newInfo] + 1
    ).catchError((e)=> print(e));
  }
});

}

我的问题是:它是否需要返回未来,因为runTransaction是Future。没有它似乎工作正常,但对我来说,感觉它应该返回一个“未来的空白”,以便能够在我使用它时等待updateOldUser。但是当我把它变成一个“Future void”然后用'return;'结束函数体时我有一个错误,说“预期返回后的价值”。但我真正不理解的是,使用另一个类似的代码:

Future<void> updateUserPhoto(User user,File userPhoto) async {
String photoUrl = await  uploadImage(user.id,userPhoto);
DocumentReference userToUpdateRef = userRef.document(user.id);
Firestore.instance.runTransaction((Transaction transaction) async {
  DocumentSnapshot userToUpdateSnapshot = await transaction.get(userToUpdateRef);
  if(userToUpdateSnapshot.exists){
    await transaction.update(
      userToUpdateSnapshot.reference, {
      'photoUrl' : photoUrl
      }
    ).catchError((e)=> print(e));
  }
});
return;

}

我没有得到这个错误,它也工作正常。为什么?提前致谢。

asynchronous dart flutter google-cloud-firestore future
1个回答
1
投票

是否需要回归未来

如果你希望调用者能够等待函数的完成,那么返回类型应该是Future<...>(如果没有具体的返回值就像Future<void>,如果结果是整数值,则返回Future<int>,......)

对于即发即忘的async函数,你可以使用void,但这种情况并不常见。如果返回类型是Future<...>,则呼叫者仍然可以决定不等待完成。

但是当我把它变成一个“Future void”然后用'return;'结束函数体时

如果使用async,则在方法结束时隐式返回Future

如果你不使用async,你需要返回一个像Future

return doSomething.then((v) => doSomethingElse());
© www.soinside.com 2019 - 2024. All rights reserved.