Flutter之Dart异步实现

2020-04-14  本文已影响0人  xulj100

1、Dart是单线程模型

Dart是单线程的,那么如何实现耗时操作呢?
Dart是基于单线程加事件循环来完成耗时操作的处理。

2、Dart事件循环

事件循环是什么呢?

3、Dart的异步操作

import 'dart:io';
main(List<String> args) {

  print("----- start ------");

  //getData();

  getNetData().then((value){
    print(value);
  });

  print("----- end   ------");
}

//耗时操作,等待3秒
String getData(){
  sleep(Duration(seconds: 3));
  return "----- 返回数据 ----";
}

//异步操作
Future<String> getNetData() {
  return Future<String>(() {
    sleep(Duration(seconds: 3));
    return "----- 异步返回数据 ----";
  });
}

查看控制台输出,返回数据方法并没有被等待,而是最后返回。

----- start ------
----- end   ------
----- 异步返回数据 ----

Future的其他用法:

import 'dart:io';

main(List<String> args) {
  print("----- start ------");

  //getData();

  getNetData().then((value) {
    print(value);
  });

  //链式调用
  getNetData().then((value1) {
    print(value1);
    return "----- second data ------";
  }).then((value2) {
    print(value2);
    return "----- third data ------";
  }).then((value3) {
    print(value3);
  });


  Future.value("----- hello future").then((value){
    print(value);
  });

  getErrorData().then((value) {
    print(value);
  }).catchError((error) {
    print(error);
  });


  getNetworkData().then((value){
    print(value);
  });

  print("----- end   ------");
}

//耗时操作,等待3秒
String getData() {
  sleep(Duration(seconds: 3));
  return "----- 返回数据 ----";
}

//异步操作
Future<String> getNetData() {
  return Future<String>(() {
    sleep(Duration(seconds: 3));
    return "----- 异步返回数据 ----";
  });
}

//抛出异常
Future<String> getErrorData() {
  return Future<String>(() {
    sleep(Duration(seconds: 3));
    throw Exception("网络请求出现错误");
  });
}

//使用 await+async 实现异步,返回的是Future类型
Future<String> getNetworkData() async {
  var result = await Future.delayed(Duration(seconds: 3), () {
    return "network data";
  });

  return "----- " + result;
}

控制台输出:

----- start ------
----- end   ------
----- hello future
----- 异步返回数据 ----
----- 异步返回数据 ----
----- second data ------
----- third data ------
Exception: 网络请求出现错误
----- network data
//使用 await+async 实现异步,返回的是Future类型
Future<String> getNetworkData() async {
  var result = await Future.delayed(Duration(seconds: 3), () {
    return "network data";
  });
  return "----- " + result;
}
上一篇下一篇

猜你喜欢

热点阅读