关于在飞镖中使用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;
}
我没有得到这个错误,它也工作正常。为什么?提前致谢。
是否需要回归未来
如果你希望调用者能够等待函数的完成,那么返回类型应该是Future<...>
(如果没有具体的返回值就像Future<void>
,如果结果是整数值,则返回Future<int>
,......)
对于即发即忘的async
函数,你可以使用void
,但这种情况并不常见。如果返回类型是Future<...>
,则呼叫者仍然可以决定不等待完成。
但是当我把它变成一个“Future void”然后用'return;'结束函数体时
如果使用async
,则在方法结束时隐式返回Future
。
如果你不使用async
,你需要返回一个像Future
return doSomething.then((v) => doSomethingElse());