Return 来自未来对象的字符串
Return String from Future Object
我正在尝试通过 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'));
}
我认为您误解了 async
关键字对方法的作用。当一个方法被标记为 async
时,它总是会自动 return 成为某个事物的 Future。这就是为什么您需要指定例如Future<String>
作为 return 类型。
但是因为创建已经完成 "automatically" 你真的不需要做以下事情:
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'));
}
我正在尝试通过 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'));
}
我认为您误解了 async
关键字对方法的作用。当一个方法被标记为 async
时,它总是会自动 return 成为某个事物的 Future。这就是为什么您需要指定例如Future<String>
作为 return 类型。
但是因为创建已经完成 "automatically" 你真的不需要做以下事情:
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'));
}