2

您将如何简单地实现此功能:

String fetchUrlBodyAsString(String url) {
  ...
}

用法:

String schema = fetchUrlBodyAsString("http://json-schema.org/draft-04/schema#");

这个线程使用 dart 下载文件解释了从主函数获取数据的好方法。但是如果你尝试一下,你会发现真正的工作发生在离开 main 之后。我认为我想要创建的同步函数很难使用 HttpClient,因为它试图让异步 api 同步工作。根据这个可能不可能的线程:https ://groups.google.com/a/dartlang.org/d/msg/misc/kAgayQyaPhQ/wonJ776_FGIJ

在非浏览器/控制台设置中实现这一点的 Dart 方法是什么?

4

3 回答 3

7

异步方法的使用真的很有感染力。一旦你开始Future在函数内部使用,你必须返回 aFuture作为结果。所以你的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.
}
于 2013-08-26T15:33:04.653 回答
3

您可以通过使用 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#");
于 2014-06-06T17:17:29.067 回答
1

没有办法将异步 API 变成同步 API;一旦你有一个 Future 作为结果,这就是你必须处理的。

对于您的具体示例,实现您想要的唯一方法是从头开始构建您自己的同步 HTTP 库。以同步方式使用异步 API 是不可能的。

于 2013-08-26T15:45:00.970 回答