让我们考虑一个方法gatherNewsReports(),它只返回一个Future<String>。来自gatherNewsReports 的Future 的字符串值。实现gatherNewsReports。
// Imagine this is a slow method. Takes time to finish
Future<String> gatherNewsReports() => Future.delayed(Duration(seconds: 1), () => news);
我们将遍历所有可能的方法调用与Future 和async 的组合。我要做的方法叫getDailyNewsDigest
选项一:
方法的一个定义可能与方法调用中给出的Future 和async 一样:
Future<String> getDailyNewsDigest() async {
var str = await gatherNewsReports();
print(str);
return str;
}
请记住 gatherNewsReports() 返回一个 Future<String>。我们只是返回 gatherNewsReports 返回的任何内容。
用法:
main() async {
await getDailyNewsDigest();
print('call done');
}
输出:
<gathered news goes here>
call done
评论:这似乎是直截了当的。您只需调用该方法并等待它。请记住,当从 main 方法调用 getDailyNewsDigest 时,我们使用了 await 关键字。因此,除非我们通过1 second,即它需要Future 执行的持续时间。如果我们不使用 await 关键字,那么输出序列将被反转。
选项 2
方法的一个定义可能与在方法调用中给出的Future 和async NOT 一样:
Future<String> getDailyNewsDigest() {
var str = await gatherNewsReports();
print(str);
return str;
}
这是无效的,因为您不能使用await 调用方法,在本例中为gatherNewsReports。 这是无效的。
选项-3
我们定义的方法可能是在方法调用中给出的Future NOT GIVEN 和async。由于返回类型将是 void,我们将不会返回任何内容(注意:如果我们尝试返回除 Future 或 void 之外的任何内容,则会收到错误):
void getDailyNewsDigest() async {
var str = await gatherNewsReports();
print(str);
}
这是一个有效的方法定义。现在,由于该方法被声明为void,我们不能在main 方法上使用await。更新的main 方法。
main() async {
getDailyNewsDigest(); // We can't await on it since return is void
print('call done');
}
输出:
call done
<gathered news goes here>
正如您所见,由于没有await 就不会调用方法getDailyNewsDigest,因此输出是相反的。我们不再等待getDailyNewsDigest 完成。
选项-4
我们定义的方法可能是Future<Void>,而不是方法调用中给出的Future<String>和async:
Future<void> getDailyNewsDigest() async {
var str = await gatherNewsReports();
print(str);
return;
}
现在在我们的 main 方法中,我们可以再次使用 await 关键字来调用 getDailyNewsDigest。
main() async {
await getDailyNewsDigest(); // We can await on it since return is Future<Void> but don't care on the output since it returns nothing
print('call done');
}
这是我能想到的 4 种组合。
至于这个:
但是我的导师有点让我困惑,有时她的未来是
返回类型和另一次她没有说,他们都是
异步函数。
用Future 声明一个方法意味着你可以等待它,用void 声明它意味着你不能在其中await。如果您不想对Future 的输出做任何事情,您当然可以选择不在Future 上使用await。如果您以不希望任何人依赖该方法的输出的方式编写代码,即,否则我们将从该方法返回的 Future 将自行处理 d,我们关心的是启动并继续我们的工作;在这种情况下,我们应该使用返回类型 void 来定义我们的方法。