在DART中向服务器提出多个独立请求的最佳方法



我想以最佳方式向同一服务器发送多个请求。所以我有

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呼叫彼此独立。什么是实施的最佳方法以避免异步等待地狱?

您可以使用Future.wait(...)等待一组Future s完成:

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-ashync/future/wait.html

günter击败了我几分钟,但是我已经输入了它,所以这里有一个轻微的选择,也可以使用,并避免使用'then''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();
}

最新更新