Оптимальный способ сделать несколько независимых запросов к серверу в Dart - PullRequest
0 голосов
/ 25 апреля 2018

Я хочу сделать несколько запросов к одному серверу оптимальным способом. Итак, у меня есть

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 независимы друг от друга. Каков наилучший способ реализации, чтобы избежать асинхронного ожидания ада?

Ответы [ 2 ]

0 голосов
/ 25 апреля 2018

Гюнтер опередил меня на пару минут, но я уже набрал его, так что вот небольшая альтернатива, которая также сработает и избегает использования «тогда» полностью.

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();
}
0 голосов
/ 25 апреля 2018

Вы можете использовать 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

...