问题:将来的函数中的Http.get请求一个接一个地调用。
//this should open 5 simultaneous http connections
for (var i= 0; i < 5; i++) {
getImage('[image soure]', i);
}
我将方法的代码分为几部分,以更好地传达问题。
import 'package:http/http.dart' as http;
void getImage(final String img, final int i) async {
var blurHash = '';
try {
//PART: LOADING
print('loading $img...');
//PART: A
var client = http.Client();
var res = await client.get(img);
print('$i: a');
//PART: B
var bbytes = res.bodyBytes;
print('$i: b');
//PART: C
var l = bbytes.toList();
print('$i: c');
...
blurHash = '...';
} catch (e) {
print(e);
}
}
控制台输出应如下所示:
loading img.png
loading img.png
loading img.png
loading img.png
loading img.png
0: a
1: a
2: a
3: a
4: a
0: b
1: b
2: b
3: b
4: b
0: c
1: c
2: c
3: c
4: c
控制台输出实际上是什么样的:
loading img.png
loading img.png
loading img.png
loading img.png
loading img.png
0: a
0: b
0: c
1: a
1: b
1: c
2: a
2: b
2: c
3: a
3: b
3: c
4: a
4: b
4: c
这意味着加载部分是同时执行的,但是看起来A部分中的http.get请求却是相互执行的。
答案 0 :(得分:1)
return someFuture.then(...)
(正如Christopher Moore在评论中解释的那样)是await null
的语法糖。除非返回/唤醒,否则无法执行函数执行。
您可以通过撒一些getImage
行来显式地允许函数产生;这样可以使您的await
呼叫按照您希望的方式交错。注意这样做不会使事情更快。每个Dart隔离都在单个线程中执行Dart代码,因此,如果您不await
进行其底层实现涉及另一个隔离或线程的异步操作,则不会节省任何时间。相反,添加额外的setTimeout()
将引入更多的上下文切换,并使所有操作花费更长的时间。 (不过,如果您的代码需要在执行昂贵的操作时响应其他事件,那仍然很有用。)