这是我在Dart的第一个程序,我只想看到它的异步功能。知道javascript我写了以下代码:
import 'dart:async' show Timer;
import 'dart:math';
void main() {
//Recursion
fib1(x) => x > 1 ? fib1(x-1) + fib1(x-2) : x;
//Mathematical
num fi = (1 + sqrt(5)) / 2;
fib2(x) => x > 1 ? ((pow(fi, x) + pow(1 - fi, x)) / sqrt(5)).round() : x;
//Linear
fib3(x) {
if(x < 2) return x;
int a1 = 0;
int a2 = 1;
int sum = 0;
for(int i = 1; i < x; i++) {
sum = a2 + a1;
a1 = a2;
a2 = sum;
}
return sum;
}
Timer.run(() => print('Fib1:' + fib1(41).toString()));
Timer.run(() => print('Fib2:' + fib2(41).toString()));
Timer.run(() => print('Fib3:' + fib3(41).toString()));
}
并且飞镖编辑器上的输出是:
Fib1:165580141
Fib2:165580141
Fib3:165580141
同时打印所有3个输出。这不是错的吗? fib3速度更快,应先打印。
答案 0 :(得分:4)
运行异步并不意味着多线程。 Dart运行单线程。您可以生成隔离区以并行运行代码。
添加打印声明时
{
//...
Timer.run(() => print('Fib1:' + fib1(41).toString()));
Timer.run(() => print('Fib2:' + fib2(41).toString()));
Timer.run(() => print('Fib3:' + fib3(41).toString()));
print('exit');
}
在你的三个Timer.run(...
语句后,你可以看到异步的内容。
您为Timer.run(...)
提供的闭包会被安排在以后执行,并且会执行您的main的下一个声明。
一旦事件循环有时间处理计划任务,您的闭包就会逐个执行。
您可以在此处找到更详细的信息:The Event Loop and Dart
**编辑**
当你以这种方式运行时,输出可能对你更有意义
Timer.run(() => print('Fib1: ${new DateTime.now()} - result: ${fib1(41)}'));
Timer.run(() => print('Fib2: ${new DateTime.now()} - result: ${fib2(41)}'));
Timer.run(() => print('Fib3: ${new DateTime.now()} - result: ${fib3(41)}'));
print('exit');
**输出**
exit
Fib1: 2014-01-07 12:00:46.953 - result: 165580141
Fib2: 2014-01-07 12:00:56.208 - result: 165580141
Fib3: 2014-01-07 12:00:56.210 - result: 165580141
并非快速任务首先结束的情况。 Timer.run()
时间表以便以后执行,main()
的执行仍在继续。当事件循环返回程序流程的控制时,它一次一个地执行计划任务,并一个接一个地执行计划任务。
可能输出是由DartEditor输出窗口或shell以某种方式缓冲并批量显示。 这可能会导致结果一次性打印出来的印象。
**编辑2 **
我刚看到结果是一个一个地写的。
如果您在最后一个位置移动慢Fib1
(Fib3
之后)