0

问题:未来函数中的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 请求是在彼此之后执行的。

4

1 回答 1

1

await someFuture(正如 Christopher Moore 在评论中解释的那样)是return someFuture.then(...). 除非它返回/等待,否则从您的函数执行不能产生。

await null您可以通过添加一些行来明确地允许您的函数屈服;这应该允许您的getImage呼叫以您想要的方式交错。请注意,这样做不会使事情变得更快;每个 Dart 隔离在单个线程中执行 Dart 代码,因此,如果您不是await一个异步操作,其底层实现涉及另一个隔离或线程,则总体上不会节省任何时间。添加额外await的 s 会引入更多的上下文切换,并使一切花费更长的时间。(不过,如果您的代码需要在执行昂贵操作的同时响应其他事件,这仍然很有用。)

于 2020-06-01T17:53:04.647 回答