flutter异步

51 阅读2分钟

有这么一个需求,我要在网络请求,请求返回成功之后做一些操作 于是就有了下面这两个代码

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();
}

第一段代码getAlarmTypeListgetAllAlarms方法将以异步方式执行,但在它们完成之前,代码将继续执行下一行和super.onReady()

第二段代码,首先调用了getAlarmTypeList方法,并使用await关键字等待其完成 接下来,调用了getAllAlarms方法,意思很明显,调用接口有了先后顺序,后一个接口要前一个接口请求完成之后调用 。