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