Доступ к телу ответа http снаружи

import 'package:http/http.dart' as http;

main() {

  String esearch = "http://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi?db=nucleotide&term=Paenibacillus";
  var uidList = [];

  http.get(esearch).then((response) {

    var pattern = new RegExp(r"<Id>(.*?)</Id>");
    var hits = pattern.allMatches(response.body);


    hits.forEach((hit) {
      print("whole match: " + hit[0] + " first match " + hit[1]);
      uidList.add(hit[1]);
    });
  });

  print(uidList.length); // empty, because main thread is faster than query
}

Здравствуйте все,

Я играю с Дартом с одного дня, чтобы выяснить, подходит ли он для моих нужд. В коде, который я прикрепил, я хочу получить доступ к телу за пределами блока http-запроса. Это невозможно В другом вопросе здесь кто-то пишет, что это из-за концепции асинхронности Дартса.

Есть ли способ получить доступ извне. Это импорт, потому что я должен вызвать несколько запросов htttp с полученными данными и не хочу вкладывать их все в блок http.

Или какие-либо другие предложения?

Большое спасибо.

1 ответ

Решение

Это не работает, потому что асинхронный вызов (http.get()) запланировано для более позднего выполнения, а затем выполнение продолжается со следующей строки. Ваш print выполняется раньше http.get() даже начал подключаться. Вы должны связать все последующие звонки с потом. Если у вас последняя версия Dart, вы можете использовать async/await, что облегчает использование асинхронных вызовов.

import 'package:http/http.dart' as http;

main() {

  String esearch = "http://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi?db=nucleotide&term=Paenibacillus";
  var uidList = [];

  return http.get(esearch).then((response) {

    var pattern = new RegExp(r"<Id>(.*?)</Id>");
    var hits = pattern.allMatches(response.body);


    hits.forEach((hit) {
      print("whole match: " + hit[0] + " first match " + hit[1]);
      uidList.add(hit[1]);
    });
    return uidList;
  }).then((uidList) {
    print(uidList.length); 
  });
}

асинхронная / Await

import 'package:http/http.dart' as http;

main() async {

  String esearch = "http://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi?db=nucleotide&term=Paenibacillus";
  var uidList = [];

  var response = await http.get(esearch);
  var pattern = new RegExp(r"<Id>(.*?)</Id>");
  var hits = pattern.allMatches(response.body);

  hits.forEach((hit) {
    print("whole match: " + hit[0] + " first match " + hit[1]);
    uidList.add(hit[1]);
  });
  print(uidList.length); 
}
Другие вопросы по тегам