# 19.Future\&Microtask

### 多个 Future

下面多个 `Future` 的执行顺序会是什么样的呢？

```
void main() {
  Future( () {
    sleep(const Duration(seconds: 1));
    return "${DateTime.now()}: 1";
  })
  .then((value){
    print(value);
  });

  Future( () {
    sleep(const Duration(seconds: 1));
    return "${DateTime.now()}: 2";
  })
      .then((value){
    print(value);
  });

  Future( () {
    sleep(const Duration(seconds: 1));
    return "${DateTime.now()}: 3";
  })
      .then((value){
    print(value);
  });

  Future( () {
    sleep(const Duration(seconds: 1));
    return "${DateTime.now()}: 4";
  })
      .then((value){
    print(value);
  });
}
```

分析： 多个 `Future` 是按照代码顺序，依次添加到任务队列的，会依次被执行。所以会按顺序输出。

```
flutter: 2021-11-27 15:34:53.829132: 1
flutter: 2021-11-27 15:34:54.855321: 2
flutter: 2021-11-27 15:34:55.863015: 3
flutter: 2021-11-27 15:34:56.870869: 4
```

### 依赖连续调用

如果有几个异步任务是有一定的顺序或者结果依赖的，那么可以通过 `then` 的链式调用进行：

```
int number = 1;

void main() {
  Future(() {
    sleep(const Duration(seconds: 1));
    number += 1;
    print("${DateTime.now()}: $number");
    return number;
  }).then((value) {
    sleep(const Duration(seconds: 1));
    value += 1;
    print("${DateTime.now()}: $value");
    return value;
  }).then((value) {
    sleep(const Duration(seconds: 1));
    value += 1;
    print("${DateTime.now()}: $value");
    return value;
  }).then((value) {
    sleep(const Duration(seconds: 1));
    value += 1;
    print("${DateTime.now()}: $value");
    return value;
  });
}
```

输出的结果：

```
flutter: 2021-11-27 15:43:29.512735: 2
flutter: 2021-11-27 15:43:30.537787: 3
flutter: 2021-11-27 15:43:31.544347: 4
flutter: 2021-11-27 15:43:32.549391: 5
```

### 多个无依赖的任务结束后处理

开发中，我们还会遇到一些多个异步任务都执行完再去做一些事情的场景。 `Future` 也有提供这种歌场景的功能：

```
void main() {
  Future.wait([
    Future(() {
      sleep(Duration(seconds: 1));
      print('${DateTime.now()}: 1');
      return "任务1";
    }),
    Future(() {
      sleep(Duration(seconds: 1));
      print('${DateTime.now()}: 2');
      return "任务2";
    }),
    Future(() {
      sleep(Duration(seconds: 1));
      print('${DateTime.now()}: 3');
    }),
    Future(() {
      sleep(Duration(seconds: 1));
      print('${DateTime.now()}: 4');
    }),
    Future(() {
      sleep(Duration(seconds: 1));
      print('${DateTime.now()}: 5');
      return "任务5";
    }),
  ]).then((value) {
    print(value);
  });
}
```

输出：

```
flutter: 2021-11-27 15:50:47.972739: 1
flutter: 2021-11-27 15:50:49.000895: 2
flutter: 2021-11-27 15:50:50.008548: 3
flutter: 2021-11-27 15:50:51.015465: 4
flutter: 2021-11-27 15:50:52.023024: 5
flutter: [任务1, 任务2, null, null, 任务5]
```

这里和使用单个 `Future` 一样，也可以通过 `then` 来处理结果。通过输出内容我们可以发现，这里的 `then` 里的 `value` 其实是一个数组，并且如果数组内部的顺序是和 `Future` 数组的顺序保持一致的。

### scheduleMicrotask

[scheduleMicrotask](https://api.flutter.dev/flutter/dart-async/scheduleMicrotask.html) 也是异步编程常用的一个 `API`，它的优先级比 `Future` 会高，同一队列中，会优先将 `微任务` 处理完成再去处理 `Future`。

#### 题目

这里通过一个题目考验一下：

```
void main() {
  Future((){
    print('1');
  }).then((value){
    print('2');
    scheduleMicrotask((){
      print('3');
    });
  }).then((value){
    print('4');
  });

  scheduleMicrotask((){
    print('5');
  });

  Future((){
    print('6');
  });

  scheduleMicrotask((){
    print('7');
  });

  print('8');
}
```

思考一下这里的输出会是什么样的顺序呢？不要运行，欢迎在评论中告诉我哦。


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://ryukiedev.gitbook.io/wiki/flutter/19.future-and-microtask.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
