你会如何简单地实现这个功能:
String fetchUrlBodyAsString(String url) {
...
}
用法:
String schema = fetchUrlBodyAsString("http://json-schema.org/draft-04/schema#");
此线程使用镖下载文件解释了一个好办法,从主函数获取数据。 但是,如果你尝试,你看,离开主后的实际工作情况。 我认为,我想创建同步功能使用HttpClient的,因为它正在试图获得一个异步API来同步工作是困难的。 根据这一线索,可能是不可能的: https://groups.google.com/a/dartlang.org/d/msg/misc/kAgayQyaPhQ/wonJ776_FGIJ
什么是飞镖的方式在非浏览器/控制台设置来实现这一点?
异步方法的使用是非常传染性。 一旦你开始使用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.
}
您可以通过使用HttpRequest.open和异步设置为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#");
有没有办法把一个异步API为同步API; 一旦你有一个未来的结果,那就是你将不得不处理一下。
为了您的具体的例子,只有这样才能达到你想要的将是从地上爬起来建立自己的同步HTTP库。 以同步的方式使用异步的API是不可能的。