【问题标题】:Return String from Future Object从未来对象返回字符串
【发布时间】:2019-11-28 19:18:02
【问题描述】:

我正在尝试通过 localproxy 获取 html 页面以解析并从中获取 url。我在 Dart 中找不到任何没有 Future 的库。所以我很难从未来对象返回字符串。下面是 dart 文件的完整代码。

import 'package:universal_html/driver.dart';
import 'package:universal_html/prefer_universal/html.dart';

String proxyUrl='http://localhost/php-proxy/index.php?q=';
String hallTicketUrl='http://www.ignou.ac.in/ignou/studentzone/results/6';

Future<String> getList()async{
  final driver = HtmlDriver();
  await driver.setDocumentFromUri(Uri.parse(proxyUrl+hallTicketUrl));
  final items = driver.document.querySelectorAll('.middleconten2column a');

  Element urls=Element.tag('urls');
  items.forEach((item)=>urls.append(Element.tag('url')
                        ..setAttribute('href',item.getAttribute('href'))
                        ..text=item.text
                        )
        );
  print('${items.length} items found');

return Future.value(urls.outerHtml);
}

String Handler(String app){
    switch(app){
       case 'list': return getList() as String;
}
return "";
}

main(){
    print(Handler('list'));
}

【问题讨论】:

    标签: string asynchronous dart future


    【解决方案1】:

    我认为您误解了 async 关键字对方法的作用。当一个方法被标记为async 时,它总是会自动返回某事的未来。这就是您需要指定例如的原因Future&lt;String&gt; 作为返回类型。

    但由于创建是“自动”完成的,因此您实际上不需要执行以下操作:

    return Future.value(urls.outerHtml);
    

    但可以这样做:

    return urls.outerHtml;
    

    在此之后,您发现了使用异步编程的问题,其中调用堆栈中的所有内容都需要标记为 async,因为您的代码中某处有 await

    我已经修复了你的代码,所以它现在希望它能在未来的所有东西上正常工作:

    import 'package:universal_html/driver.dart';
    import 'package:universal_html/prefer_universal/html.dart';
    
    String proxyUrl = 'http://localhost/php-proxy/index.php?q=';
    String hallTicketUrl = 'http://www.ignou.ac.in/ignou/studentzone/results/6';
    
    Future<String> getList() async {
      final driver = HtmlDriver();
      await driver.setDocumentFromUri(Uri.parse(proxyUrl + hallTicketUrl));
      final items = driver.document.querySelectorAll('.middleconten2column a');
    
      Element urls = Element.tag('urls');
      items.forEach((item) => urls.append(Element.tag('url')
        ..setAttribute('href', item.getAttribute('href'))
        ..text = item.text));
      print('${items.length} items found');
    
      return urls.outerHtml;
    }
    
    Future<String> Handler(String app) async {
      switch (app) {
        case 'list':
          return await getList();
      }
      return "";
    }
    
    main() async {
      print(await Handler('list'));
    }
    

    【讨论】:

    • 谢谢我学到了新东西。但是我仍然无法理解如何通过制作它的类/库来在任何地方使用它,即在命令行、javascript 和服务器程序中。例如有人在服务器上调用 api 并且处理程序处理请求,它如何独立于 Future Object 返回 xml/json。
    • 我尝试使用货架服务器,但无法将相同的处理程序('list')输出分配给响应。
    • shelf.Response _echoRequest(shelf.Request request){shelf.Response.ok('Request for "${request.url}"\n'+ht.handler('list')); }
    • 请用新问题的详细信息更新您的问题或创建一个新问题。如果没有任何代码上下文,很难为您提供帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-17
    • 1970-01-01
    • 2013-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-23
    相关资源
    最近更新 更多