dart中的未来/完成程序行为未异步运行
我只是想了解期货的行为。下面是一个示例代码:dart中的未来/完成程序行为未异步运行,dart,future,Dart,Future,我只是想了解期货的行为。下面是一个示例代码: import'dart:async'; main() { Future short = shortWait(); Future medium = mediumWait(); Future long = longWait(); long.then((String e)=>print(e)); medium.then((String e)=> print(e)); short.then((String e)=>
import'dart:async';
main() {
Future short = shortWait();
Future medium = mediumWait();
Future long = longWait();
long.then((String e)=>print(e));
medium.then((String e)=> print(e));
short.then((String e)=> print(e));
}
Future<String> longWait() {
Completer c = new Completer<String>();
for (int i=0; i<100000000; i++); // creating long latency
c.complete("long");
return c.future;
}
Future<String> mediumWait() {
Completer c = new Completer<String>();
for (int i=0; i<10000; i++); // creating medium length latency
c.complete("medium");
return c.future;
}
Future<String> shortWait() {
Completer c = new Completer<String>();
c.complete("short"); // no latency
return c.future;
}
// short
// medium
// long
import'dart:async';
main(){
未来短期=短期等待();
未来媒体=媒体等待();
未来长=长等待();
long.then((字符串e)=>print(e));
中等。然后((字符串e)=>打印(e));
short.then((字符串e)=>print(e));
}
未来长等待(){
完成符c=新的完成符();
对于(inti=0;i记住,Dart中的异步并不意味着并行
在您的示例中,您基本上是在队列中放置五个任务:
数到100000000
打印“长”
数到一万
打印“中等”
打印“short”
所以他们就按这个顺序被处死
在Dart中,异步意味着在等待某件事情发生时,代码不必被阻塞。这通常是核心库提供的一种功能,例如从文件中获取数据,或通过网络进行交互—由操作系统或浏览器执行的任务
考虑这一点的一种方法是,Dart程序可以与操作系统或浏览器执行的内容“并行”执行,但不能自行执行
Dart还可以在等待计时器启动时“并行”执行代码。例如:
import 'dart:async';
main() {
// Long latency
(new Future.delayed(new Duration(seconds: 5)).then((_) => print('long')));
// Medium latency
(new Future.delayed(new Duration(seconds: 2)).then((_) => print('medium')));
// Short latency
(new Future.delayed(new Duration(seconds: 1)).then((_) => print('short')));
print('go');
}
印刷品:
go
short
medium
long
谢谢。整个代码仍然暂停,等待一切,然后在完成后运行。打印顺序似乎仍然与我在main()中创建未来对象的顺序有关。如果未来只在循环之后返回,shortWait()函数不应该先返回值,然后是mediumWait(),然后是longWait()吗?当我使用新的Future.delayed(新的持续时间(秒:10))时,我认为系统实际上没有等待10秒。再次感谢。我把这个放在了省道板上。()当你使用延时时,它会返回一个未来,这样你就不必使用补全符了。看这个@rchkm,我之前在答案中写的代码是错误的。我已经用正确的代码更新了答案。只需补充一点,在Dart中并行处理事情时,有方便的双向通信。谢谢。这有助于解决问题t、 我添加的延迟只是一些非常复杂的计算的代表。时间延迟不是一回事,我相信你会同意。考虑到这一点,你是说没有简单的方法使这些函数并行工作,而不使用隔离,而只使用未来?@rchkm你可以设置0秒的延迟nds并在其中进行复杂的计算。@rchkm是的,仅使用隔离的并发/并行函数。Dart是单线程的,这在我看来是件好事。原因如下1)使用共享内存ala Java的并行编程被证明在传输到JS时容易出错,JS也是单线程的。还有一些有用的链接:,@rchkm正确在Dart中执行并行处理的唯一方法是使用隔离。
Future<String> longWait() {
return new Future.delayed(new Duration(seconds: 10), ()=>'long');
}
Future<String> mediumWait() {
return new Future.delayed(new Duration(seconds: 5), ()=>'medium');
}
Future<String> shortWait() {
return new Future.delayed(new Duration(seconds: 0), ()=>'short');
}
import 'dart:async';
main() {
// Long latency
(new Future.delayed(new Duration(seconds: 5)).then((_) => print('long')));
// Medium latency
(new Future.delayed(new Duration(seconds: 2)).then((_) => print('medium')));
// Short latency
(new Future.delayed(new Duration(seconds: 1)).then((_) => print('short')));
print('go');
}
go
short
medium
long