gpt4 book ai didi

dart - dart 中的 future /完成行为不异步运行

转载 作者:行者123 更新时间:2023-12-01 18:28:33 25 4
gpt4 key购买 nike

我只是想了解 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)=> 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

我注意到了一些事情。首先,代码看起来是同步的,而最长延迟的函数 longWait() 是阻塞的。直到所有内容都可用后才会显示输出,然后立即显示所有内容。我认为它应该首先显示可用的内容,然后在 Futures 完成时显示。

其次,显示顺序似乎反射(reflect)了Futureshort/medium/long=shortWait/mediumWait/longWait()的显示顺序。即更改这些行的顺序,输出的顺序也会相应更改。每个方法的延迟时间有多长并不重要,短/中/长的显示顺序也没有任何区别。then((e) => print(e))。

我希望代码 1) 在数据可用时显示输出,2) 输出的顺序应反射(reflect)函数的延迟。除了了解 future 的基本概念之外,我实际上并不想做任何事情。

最佳答案

请记住,Dart 中的异步并不意味着并行

您在示例中实质上所做的是将五个任务放入队列中:

  1. 数到 100000000
  2. 打印“长”
  3. 数到 10000
  4. 打印“中”
  5. 打印“短”

因此它们会按照该顺序执行。

在 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

关于dart - dart 中的 future /完成行为不异步运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41083994/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com