关于dart:Flutter-113Flutter手把手教程Dart语言异步FutureStreamasyncawait详解

28次阅读

共计 1723 个字符,预计需要花费 5 分钟才能阅读完成。

作者 | 弗拉德
起源 | 弗拉德(公众号:fulade_me)

异步

Dart 代码库中有大量返回 FutureStream对象的函数,这些函数都是 异步 的,它们会在耗时操作执行结束前间接返回而不会期待耗时操作执行结束。
asyncawait 关键字用于实现异步编程,并且让你的代码看起来就像是同步的一样。

Future

能够通过上面两种形式,取得 Future 执行实现的后果:

  • 应用 asyncawait
  • 应用Future API

应用 asyncawait的代码是异步的,然而看起来有点像同步代码。例如,上面的代码应用 await 期待异步函数的执行后果。

await lookUpVersion();

必须在带有 async 关键字的 异步函数 中应用 await

Future checkVersion() async {var version = await lookUpVersion();
  // 应用 version 持续解决逻辑
}

只管异步函数能够解决耗时操作,然而它并不会期待这些耗时操作实现,异步函数执行时会在其遇到第一个 await表达式的时候返回一个 Future 对象,而后期待 await 表达式执行结束后继续执行。

应用 trycatch 以及 finally 来解决应用 await 导致的异样:

try {version = await lookUpVersion();
} catch (e) {// 无奈找到版本时做出的反馈}

你能够在异步函数中屡次应用 await 关键字。例如,上面代码中期待了三次函数后果:

var entrypoint = await findEntrypoint();
var exitCode = await runExecutable(entrypoint, args);
await flushThenExit(exitCode);

await表达式的返回值通常是一个 Future 对象;
如果不是的话也会主动将其包裹在一个 Future 对象里。Future对象代表一个 ” 承诺 ”,await表达式会阻塞直到须要的对象返回。

如果在应用 await 时导致编译谬误,请确保 await 在一个异步函数中应用。例如,如果想在 main() 函数中应用 await,那么main() 函数就必须应用 async 关键字标识。

Future main() async {checkVersion();
  print('在 Main 函数中执行:版本是 ${await lookUpVersion()}');
}

申明异步函数

定义 异步函数 只需在一般办法上加上 async 关键字即可。
将关键字 async 增加到函数并让其返回一个 Future 对象。假如有如下返回String 对象的办法:

String lookUpVersion() => '1.0.0';

将其改为异步函数,返回值是Future

Future<String> lookUpVersion() async => '1.0.0';

留神,函数体不须要应用 Future API。如有必要,Dart 会创立 Future 对象。
如果函数没有返回有效值,须要设置其返回类型为 Future<void>

Stream

Stream也是用于接管异步事件数据,和 Future 不同的是,它能够接管多个异步操作的后果(胜利或失败)。也就是说,在执行异步工作时,能够通过屡次触发胜利或失败事件来传递后果数据或谬误异样。Stream罕用于会屡次读取数据的异步工作场景,如网络内容下载、文件读写等。举个例子:

Stream.fromFutures([
  // 1 秒后返回后果
  Future.delayed(new Duration(seconds: 1), () {return "hello 1";}),
  // 抛出一个异样
  Future.delayed(new Duration(seconds: 2),(){throw AssertionError("Error");
  }),
  // 3 秒后返回后果
  Future.delayed(new Duration(seconds: 3), () {return "hello 3";})
]).listen((data){print(data);
}, onError: (e){print(e.message);
},onDone: (){});

下面的代码顺次会输入:

hello 1
Error
hello 3

正文完
 0