Dart:同时发出http请求

时间:2020-06-01 16:23:12

标签: dart dart-http

问题:将来的函数中的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请求却是相互执行的。

1 个答案:

答案 0 :(得分:1)

return someFuture.then(...)(正如Christopher Moore在评论中解释的那样)是await null的语法糖。除非返回/唤醒,否则无法执行函数执行。

您可以通过撒一些getImage行来显式地允许函数产生;这样可以使您的await呼叫按照您希望的方式交错。注意这样做不会使事情更快。每个Dart隔离都在单个线程中执行Dart代码,因此,如果您不await进行其底层实现涉及另一个隔离或线程的异步操作,则不会节省任何时间。相反,添加额外的setTimeout()将引入更多的上下文切换,并使所有操作花费更长的时间。 (不过,如果您的代码需要在执行昂贵的操作时响应其他事件,那仍然很有用。)