我想以最优的方式向同一服务器发出多个请求。所以我有
Future<List<Item>> getAllItems() async {
var client = new http.Client();
List<String> itemsIds = ['1', '2', '3']; //different ids
List<Item> itemList = [];
for (var item in itemsIds) {
//make call to server eg: 'sampleapi/1/next' etc
await client.get('sampleapi/' + item + '/next').then((response) {
//Do some processing and add to itemList
});
}
client.close();
return itemList;
}
现在,一个接一个地进行api调用。但是api调用是相互独立的。为了避免等待地狱的异步,最好的实现方式是什么?
发布于 2018-04-25 17:22:57
您可以使用Future.wait(...)
等待一组Future
完成:
Future<List<Item>> getAllItems() async {
var client = new http.Client();
List<String> itemsIds = ['1', '2', '3']; //different ids
return Future.wait<Item>(['1', '2', '3'].map((item) =>
client.get('sampleapi/' + item + '/next').then((response) {
//Do some processing and add to itemList
return foo; // some Item that is the result of this request
});
);
}
另请参阅https://api.dartlang.org/stable/1.24.3/dart-async/Future/wait.html
发布于 2018-04-25 17:31:44
Günter比我早了几分钟,但我已经把它打出来了,所以这里有一个轻微的替代方案,它也可以工作,并完全避免使用'then‘。
Future<List<Item>> getAllItems() async {
var client = new Client();
List<String> itemsIds = ['1', '2', '3']; //different ids
List<Response> list = await Future.wait(itemsIds.map((itemId) => client.get('sampleapi/$itemId/next')));
return list.map((response){
// do processing here and return items
return new Item();
}).toList();
}
https://stackoverflow.com/questions/50027632
复制相似问题