- 我們在項目開發(fā)中的會遇到一個頁面同時請求多個接口的情況,而且接口是同時發(fā)出的并發(fā)請求,正常接口請求一般都是通過dio進(jìn)行封裝過后的,如下:
//創(chuàng)建數(shù)據(jù)請求
requestBannerListData(){
DioUtils.postHttp("student/banner/getPublicList", onSuccess: (data){
final bannerModel = bannerModelFromJson(jsonEncode(data));
_bannerList.clear();
_bannerList.addAll(bannerModel);
}, onError: (int code, String error) {
});
}
通常一個接口請求會如上所示.為了方便我們獲取到數(shù)據(jù)直接使用,返回的數(shù)據(jù)通常也不是Future類型的,那么多個接口一起并發(fā)請求時該怎么處理呢,肯定不是一個接口一個接口順序去調(diào)用,此時我們會用Future提供的一個方法,Future.await去請求數(shù)據(jù),但要注意的是Future.await要求傳入返回Future類型的數(shù)據(jù),顯然我們封裝的接口不滿足.改造后的代碼如下
_getAllData() async{
await Future.wait<dynamic>([requestBannerListData(),requestVideoListData()]).then((value){
_isSuccessLoad = true;
_bannerList.clear();
_bannerList.addAll(value[0]);
_videoList.clear();
_videoList.addAll(value[1]);
ProgressDialog.hideProgress(this.context);
setState(() {
// 重置刷新狀態(tài)
_controller.resetLoadState();
});
}).catchError((error){
});
}
//創(chuàng)建數(shù)據(jù)請求
requestBannerListData() async{
var result;
await Future(()=> DioUtils.postHttp("student/banner/getPublicList", onSuccess: (data){
final bannerModel = bannerModelFromJson(jsonEncode(data));
result = bannerModel;
}, onError: (int code, String error) {
}));
return result;
}
//創(chuàng)建數(shù)據(jù)請求
requestVideoListData() async{
//ProgressDialog.showProgress(context);
Map<String, dynamic> parma = {
"sectionId": "3",
"sortType": _sortId,
"page": 1,
"subjectId": _subjectId
};
var result;
await Future(()=> DioUtils.postHttp("trs/getVideos", parameters: parma, onSuccess: (data) {
final listmodel = videoListModelFromJson(jsonEncode(data));
result = listmodel;
}, onError: (int code, String error) {
}));
return result;
}
如上就完成了多接口的并發(fā)請求,當(dāng)兩個接口都請求成功拿到數(shù)據(jù)之后,Future.await的value就是兩個接口結(jié)果組成的數(shù)組,然后再進(jìn)行數(shù)據(jù)的操作和頁面的刷新
如果對您有幫助,請不吝點個贊,謝謝