function - 异步函数一个接一个地返回两个不同的结果
问题描述
我编写了一个异步 Flutter/Dart 函数,在我看来它的行为出乎意料。以下代码结构:
static Future<bool> verifySometing() async {
try {
await getCloudData().then((snapshot) {
if (snapshot.exists && snapshot.hasData) {
bool dataValid = await validateData(snapshot.data);
if (dataValid) {
print('Data is correct');
return true;
}
}
});
} catch (e) {
print('Error $e');
return false;
}
print('Something went wrong');
return false;
}
预期的结果是该函数等待云数据,然后等待验证,如果数据有效则返回 true。在这种情况下,控制台将显示以下内容并且函数将返回 true:
Data is correct
实际发生的情况是控制台显示以下输出,并且该函数首先返回 true,然后返回 false:
Data is correct
Something went wrong
这与我想知道的关于 Dart 中的函数的任何事情都背道而驰,因为我总是假设一旦触发 return,函数就完成了。任何想法这是如何发生的?
解决方案
问题在于这条线。
await getCloudData().then((snapshot) {
await
在这里,您还附加了一个then
回调,而不仅仅是ing。所以实际上,无论您返回什么都是callback
函数的返回值,即 ., (snapshot) {}
.
您需要传入的回调函数将then
其return true
作为await
.
所以,如果你会放一些类似的东西
var bool = await getCloudData().then((snapshot) { ..... });
那么这个bool
,就等于true
。而已。您的主要功能没有返回。
改成这样,
var snapshot = await getCloudData();
if (snapshot.exists && snapshot.hasData) {
bool dataValid = await validateData(snapshot.data);
if (dataValid) {
print('Data is correct');
return true;
}
}
希望,我能够解释清楚。
推荐阅读
- regex - 估算缺失值
- oracle - 安装 EMC12c 配置助手存储库失败
- java - 将 Json 转换为 Pojo 实现标记接口
- charts - Qlikview 组合图表 - 系列未与轴对齐
- swift - 无法从图库图片中扫描 QR
- amazon-web-services - 如何使用在 AWS 外部管理的域创建子域以指向 Cloudfront CDN 端点
- azure-ad-b2c - Azure B2C - 我的客户想要发送他在托管政策中添加的自定义声明的国家代码值
- c# - 如何在 PowerShell 中逐行使用 C# 从 URI 读取文件?
- c# - ANTLR4 - VisitChildren 返回 null,即使孩子返回某个对象
- python - form.save() 不起作用我的 form.save 用于更新数据不起作用