Доступ к телу ответа 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);
}