从外部访问 http 响应体
Access http response body from outside
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
}
大家好,
从某一天开始,我就开始研究 Dart,以弄清楚它是否适合我的需要。在我附加的代码中,我想访问 http 查询块之外的正文结果。这是不可能的。在这里的另一个问题中,有人写道这是因为 Darts 异步概念。
有没有办法从外部访问。这是重要的,因为我必须用结果数据触发几个 http 请求,并且不会将它们全部嵌套在 http 块中。
或者有其他建议吗?
非常感谢。
这种方式行不通,因为异步调用 (http.get()
) 被安排在稍后执行,然后执行会继续下一行。您的 print
甚至在 http.get()
开始连接之前就已执行。您需要将所有连续调用与 then 链接起来。
如果你有最新的 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);
});
}
async/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);
}
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
}
大家好,
从某一天开始,我就开始研究 Dart,以弄清楚它是否适合我的需要。在我附加的代码中,我想访问 http 查询块之外的正文结果。这是不可能的。在这里的另一个问题中,有人写道这是因为 Darts 异步概念。
有没有办法从外部访问。这是重要的,因为我必须用结果数据触发几个 http 请求,并且不会将它们全部嵌套在 http 块中。
或者有其他建议吗?
非常感谢。
这种方式行不通,因为异步调用 (http.get()
) 被安排在稍后执行,然后执行会继续下一行。您的 print
甚至在 http.get()
开始连接之前就已执行。您需要将所有连续调用与 then 链接起来。
如果你有最新的 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);
});
}
async/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);
}