您如何简单地实现此功能:
String fetchUrlBodyAsString(String url) {
...
}
用法:
String schema = fetchUrlBodyAsString("http://json-schema.org/draft-04/schema#");
这个帖子Using dart to download a file解释了从主函数获取数据的好方法。但是,如果你尝试它,你会看到真正的工作发生在离开主要之后。我认为我想要创建的同步函数很难使用HttpClient,因为它试图让异步api同步工作。根据这个线索可能无法实现:https://groups.google.com/a/dartlang.org/d/msg/misc/kAgayQyaPhQ/wonJ776_FGIJ
在非浏览器/控制台设置中实现此操作的Dart方式是什么?
答案 0 :(得分:6)
使用异步方法确实具有感染力。在函数内部开始使用Future
后,您必须返回Future
作为结果。因此,您的fetchUrlBodyAsString
函数可能如下所示:
import 'dart:io';
import 'dart:async';
Future<String> fetchUrlBodyAsString(String url) =>
new HttpClient().getUrl(Uri.parse(url))
.then((HttpClientRequest request) => request.close())
.then((HttpClientResponse response) =>
response.transform(new StringDecoder()).join());
main() {
final url = "http://json-schema.org/draft-04/schema#";
Future<String> schema = fetchUrlBodyAsString(url);
schema.then(handleContent);
}
handleContent(String content) {
print(content); // or do what you want with content.
}
或async
/ await
:
import 'dart:io';
import 'dart:async';
Future<String> fetchUrlBodyAsString(String url) async {
var request = await new HttpClient().getUrl(Uri.parse(url));
var response = await request.close();
return response.transform(new StringDecoder()).join();
}
main() async {
final url = "http://json-schema.org/draft-04/schema#";
handleContent(await fetchUrlBodyAsString(url));
}
handleContent(String content) {
print(content); // or do what you want with content.
}
答案 1 :(得分:2)
您可以使用HttpRequest.open并将 async 设置为false来制作同步http请求。
https://api.dartlang.org/apidocs/channels/stable/dartdoc-viewer/dart-dom-html.HttpRequest#id_open
import 'dart:html';
String fetchUrlBodyAsString(String url) {
var request = new HttpRequest()
..open('GET', url, async: false)
..send();
return request.responseText;
}
String schema = fetchUrlBodyAsString("http://json-schema.org/draft-04/schema#");
答案 2 :(得分:1)
无法将异步API转换为同步API;一旦你有了未来,那就是你必须要处理的事情。
对于您的具体示例,实现您想要的唯一方法是从头开始构建您自己的同步HTTP库。无法以同步方式使用异步API。