首页 > 解决方案 > 基本的异步/等待模式?

问题描述

我试图找出 Dart 中的异步/等待问题。我正在调用一个简短的 http 获取序列并希望等待它们。我创建了这个示例代码来演示这个问题。

我希望看到“开始测试”,然后按顺序开始每个下载。然后每个下载都会以随机顺序完成,然后我会看到“结束测试”。但是,我什至在任何下载开始之前就看到了“结束测试”。

请帮助我理解我做错了什么。

import 'dart:async';
import 'package:http/http.dart' as http;

class AsyncTest {
  final _resourceList = [
    {
      'name': 'Test 1',
      'url': 'https://jsonplaceholder.typicode.com/posts'
    },
    {
      'name': 'Test 2',
      'url': 'https://jsonplaceholder.typicode.com/comments'
    },
    {
      'name': 'Test 3',
      'url': 'https://jsonplaceholder.typicode.com/albums'
    },
    {
      'name': 'Test 4',
      'url': 'https://jsonplaceholder.typicode.com/photos'
    },
    {
      'name': 'Test 5',
      'url': 'https://jsonplaceholder.typicode.com/users'
    },
  ];

  void beginTest() async {
    print('begin test');
    await getAll();
    print('end test');
  }

  Future<void> getAll() async {
    _resourceList.forEach((resource) async {
      print('begin ${resource['name']}');

      final response = await http.get(resource['url']);

      print('end ${resource['name']}');
    });
  }
}

这是输出。

flutter: begin test
flutter: end test
flutter: begin Test 1
flutter: begin Test 2
flutter: begin Test 3
flutter: begin Test 4
flutter: begin Test 5
flutter: end Test 1
flutter: end Test 5
flutter: end Test 3
flutter: end Test 2
flutter: end Test 4

标签: dart

解决方案


await在内部的调用getAll()允许事件循环处理不同的路径。所以是的,所有早期的事情(开始......)首先出现,而后来的事情(结束......)以明显随机的顺序出现是有道理的。这是异步编程的内在本质。


推荐阅读