Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dart 飞镖计时器出错了?_Dart_Dart Async - Fatal编程技术网

Dart 飞镖计时器出错了?

Dart 飞镖计时器出错了?,dart,dart-async,Dart,Dart Async,这是我在Dart中的第一个程序,我只是想看看它的异步功能。了解javascript后,我编写了以下代码: 导入'dart:async'显示计时器; 导入“dart:math”; void main(){ //递归 fib1(x)=>x>1?fib1(x-1)+fib1(x-2):x; //数学的 num fi=(1+sqrt(5))/2; fib2(x)=>x>1?((pow(fi,x)+pow(1-fi,x))/sqrt(5)).round():x; //线性的 fib3(x){ 如果(xpr

这是我在Dart中的第一个程序,我只是想看看它的异步功能。了解javascript后,我编写了以下代码:

导入'dart:async'显示计时器;
导入“dart:math”;
void main(){
//递归
fib1(x)=>x>1?fib1(x-1)+fib1(x-2):x;
//数学的
num fi=(1+sqrt(5))/2;
fib2(x)=>x>1?((pow(fi,x)+pow(1-fi,x))/sqrt(5)).round():x;
//线性的
fib3(x){
如果(x<2)返回x;
int a1=0;
int a2=1;
整数和=0;
对于(int i=1;iprint('Fib1:'+Fib1(41.toString()));
Timer.run(()=>print('Fib2:'+Fib2(41.toString()));
Timer.run(()=>print('Fib3:'+Fib3(41.toString()));
}
dart编辑器上的输出为:

Fib1:165580141
Fib2:165580141
Fib3:165580141

所有3个输出同时打印。这不对吗?fib3速度更快,应该首先打印。

运行异步并不意味着多线程。Dart运行单线程。您可以生成隔离以并行运行代码

添加打印语句时

{
//...
Timer.run(()=>print('Fib1:'+Fib1(41.toString()));
Timer.run(()=>print('Fib2:'+Fib2(41.toString()));
Timer.run(()=>print('Fib3:'+Fib3(41.toString()));
打印(“退出”);
}
在三个
Timer.run(…
语句之后,您可以大致了解异步的含义

为Timer.run(…)提供的闭包将被安排在以后执行,并执行main的下一条语句。 一旦事件循环有时间处理计划的任务,您的闭包就会一个接一个地执行

您可以在此处找到更深入的信息:

**编辑**

以这种方式运行时,输出可能对您更有意义

Timer.run(()=>print('Fib1:${newdatetime.now()}-result:${Fib1(41)}');
Timer.run(()=>print('Fib2:${new DateTime.now()}-result:${Fib2(41)}');
Timer.run(()=>print('Fib3:${new DateTime.now()}-result:${Fib3(41)}');
打印(“退出”);
**输出**

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
之后)

运行异步并不意味着多线程。Dart运行单线程。您可以生成隔离以并行运行代码

添加打印语句时

{
//...
Timer.run(()=>print('Fib1:'+Fib1(41.toString()));
Timer.run(()=>print('Fib2:'+Fib2(41.toString()));
Timer.run(()=>print('Fib3:'+Fib3(41.toString()));
打印(“退出”);
}
在三个
Timer.run(…
语句之后,您可以大致了解异步的含义

为Timer.run(…)提供的闭包将被安排在以后执行,并执行main的下一条语句。 一旦事件循环有时间处理计划的任务,您的闭包就会一个接一个地执行

您可以在此处找到更深入的信息:

**编辑**

以这种方式运行时,输出可能对您更有意义

Timer.run(()=>print('Fib1:${newdatetime.now()}-result:${Fib1(41)}');
Timer.run(()=>print('Fib2:${new DateTime.now()}-result:${Fib2(41)}');
Timer.run(()=>print('Fib3:${new DateTime.now()}-result:${Fib3(41)}');
打印(“退出”);
**输出**

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
之后),很容易验证

我不认为异步一定是多线程的,我在NodeJS中编程,它也有单线程异步I/o。我知道更快的程序首先结束。Fib3比fib2和fib1快很多吨,它仍然在等待它们完成,然后所有打印都一个接一个地同步执行,这很奇怪。感谢您澄清您的要求ion.yes我认为是一种带有缓冲输出的顺序执行,但他们在文档中告诉你的是非常奇怪的。我认为
Timer.run
相当于javascript的
setTimeout(callback,0)
你为什么认为`setTimeout(callback,0)是不同的吗?好吧,它不是用javascript编写等价的代码并执行它(不是dart2js,我用nodejs运行生成的javascript代码,它用DartEditor也这样做了)。你会看到不同的结果,就像我使用chrome控制台时看到的一样。我不认为异步一定是多线程的,我在NodeJS中编程,它也有单线程异步I/o。我知道更快的程序首先结束。Fib3比fib2和fib1快很多吨,它仍在等待它们完成,然后所有打印都同步执行一个接一个,这很奇怪。谢谢你澄清你的问题。是的,我认为有缓冲输出的顺序执行,但他们在文档中告诉你的是非常奇怪的。我认为
时间