Как сделать вложенный вызов httpClient, несколько асинхронных / ждет в Dart - PullRequest
0 голосов
/ 07 мая 2019

Мне нужно сделать несколько звонков, используя httpClient. Один из них получает «основные» данные для данного поста в блоге в формате json, и с этой информацией мне нужно сделать второй вызов для получения дополнительной информации о медиа, связанной с этим постом.

Это все для нескольких постов, поэтому по сути я делаю:

Future<List<String>> fetchPosts() async {
  response = await httpClient.get('http://somewebsite/topPosts');
  data = json.decode(response.body) as List;
  data.map((singlePost) {
    mediaID = singlePost["mediaID"];
    //second await call below, this won't work as-is, correct?
    finalData = await httpClient.get('http://somewebsite/media/$mediaID')

Надеюсь, это имеет смысл, что я пытаюсь сделать. По сути я вкладываю http звонки. Не уверен в «хорошем» способе сделать это, может быть, что-то с Future.wait(), любые советы приветствуются.

1 Ответ

1 голос
/ 08 мая 2019
 data.map((singlePost) {
    mediaID = singlePost["mediaID"];
    //second await call below, this won't work as-is, correct?
    finalData = await httpClient.get('http://somewebsite/media/$mediaID')

Не собирается работать. Во-первых, вы используете await в обратном вызове, предоставленном map, но await можно использовать только в функции, помеченной async.

После того, как вы пометите обратный вызов async, код, вероятно, не будет делать то, что вы хотите. List.map() используется для преобразования a List. Например, вы использовали бы его для создания списка String s из списка int s или наоборот. В этом случае вы будете генерировать список (на самом деле Iterable) из Future с. Вы нигде не храните этот список Future, и поэтому вы никогда не сможете await уведомить их о завершении.

То, что вы могли бы это что-то вроде:

final futures = data.map((singlePost) async { ... });
await Future.wait(futures);

И это будет ждать всех операций для завершения. Однако у вас будет другая проблема, связанная с тем, что ваш map обратный вызов делает:

finalData = await httpClient.get('http://somewebsite/media/$mediaID')

, что означает, что каждый обратный вызов будет сбивать переменную finalData (независимо от того, что это) в некотором неопределенном порядке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...