有这么一个需求,我要在网络请求,请求返回成功之后做一些操作 于是就有了下面这两个代码
Future<bool?> updatePatrolTask(PatrolTaskModel model) async {
bool result = false;
await ApiClient.acquire.updatePatrolTask(patrol: model).then((value) {
if (value.isSuccess) {
getPatrolTaskListById();
result = true;
}
});
return result;
}
Future<bool?> requestUpdatePatrolTask(PatrolTaskModel model) async {
bool result = false;
try {
var value = await ApiClient.acquire.updatePatrolTask(patrol: model);
if (value.isSuccess) {
getPatrolTaskListById();
result = true;
}
} catch (e) {
// 处理异常
print('Error: $e');
}
return result;
}
这就有有一个问题,这两处代码效果是一样的吗?
很显然,代码二是符合我们需求的,
await会使方法变成异步,然后等待updatePatrolTask异步方法的完成,并将返回的结果赋值给了result,然后,根据异步操作的结果设置result
变量这样做可以确保在返回result
之前,异步操作已经完成并且result
被正确设置
而第一段代码,则是使用.then方法来处理异步updatePatrolTask异步操作的结果,.then
方法会在异步操作updatePatrolTask完成后执行.then回调函数,但是不会等待回调函数执行完成,而是立即返回result
,也就是说,updatePatrolTask请求返回之后,会调用then大括号的方法,但是不会阻塞requestUpdatePatrolTask方法的继续执行,因此,无论异步操作是否成功,result
都会被返回为初始值false
,因为return result
语句会在异步操作开始之后立即执行
所以如果希望在异步操作完成后再返回结果,可以使用await
关键字来等待异步操作
于是又有了两段代码
@override
void onReady() async {
getAlarmTypeList();
getAllAlarms(type: type.value, unitId: currentAgentUnit.value?.unitId);
super.onReady();
}
@override
void onReady() async {
await getAlarmTypeList();
await getAllAlarms(type: type.value, unitId: currentAgentUnit.value?.unitId);
super.onReady();
}
第一段代码getAlarmTypeList
和getAllAlarms
方法将以异步方式执行,但在它们完成之前,代码将继续执行下一行和super.onReady()
第二段代码,首先调用了getAlarmTypeList
方法,并使用await
关键字等待其完成
接下来,调用了getAllAlarms
方法,意思很明显,调用接口有了先后顺序,后一个接口要前一个接口请求完成之后调用 。