Dart 异步编程之 Future

发布于 2022-09-01 23:13:08 字数 3368 浏览 216 评论 0

Dart 中 Future 类似于 JavaScript 中的 Promise,类似于 Promise,Future 可以通过两个方式 completed,分别是 succeed 和 fail,相当于 Promise 里的 fullfilled 和 rejected。

简单的构造一个 Future 实例:

Future(() => 12)

当 Future completed 的时候可以通过 then 来执行下一步,如:

  Future.delayed(Duration(seconds: 3), () => 12)
      .then((value) => value + 1)
      .then((value) => print(value));

最终打印 13

当然也可以使用 catchError 来捕获异常:

  Future.delayed(Duration(seconds: 3), () => {throw 'error'})
      .then((value) => print('success'))
      .catchError((e) {
        print(e);
        return 'future 2';
      });

如果需要捕获单次 Future 实现如 Promise 如下的效果:

new Promise(resolve => resolve()).then().catch()

可以使用 then 的命名参数 onError

  Future.delayed(Duration(seconds: 3), () => {throw 'error'}).then((value) {
    return 'success';
  }, onError: (err) {
    return 'fail';
  }).then((val) => print(val));

这时候打印 fail

除此之外,还有其他构造函数,如创建一个以 error 完成的 Future,类似于 Promise.reject

  Future.error((err) => 'huruji').then((value) {
    return 'success';
  }, onError: (err) {
    return 'fail';
  }).then((val) => print(val));

这时候打印 fail.

类似 Promise.resolve 可以使用 Future.value

Future.value(12).then((value) {
    print(value);
  });

如果想要立即执行一个 computation 函数,可以使用 Future.sync,如果需要延迟执行可以使用 Future.delayed

  Future.sync(() => 12).then(print);

  Future.delayed(Duration(seconds: 2), () => 12).then(print);

除了这些构造函数以外,一个 Future 实例还有 .then() .catchError() .whenComplete(),这些都和 Promise 类似,whenComplete 类似于 finally,此外,还有 .timeout 方法,类似于构造函数 Future.delayed

Future(() => 12).timeout(Duration(seconds: 3)).then(print);

当然,还提供了一些对应的静态方法,Future.any 对标 Promise.race

  Future.any([
    Future.delayed(Duration(seconds: 2), () => 12)
        .then((val) => throw 'huruji'),
    Future.delayed(Duration(seconds: 5), () => 15)
  ]).then((val) => print(val), onError: (e) {
    print(e);
    print('faile');
  });

Future.wait 对标 Promise.all

  Future.wait([
    Future.delayed(Duration(seconds: 2), () => 12),
    Future.delayed(Duration(seconds: 5), () => 15)
  ]).then((val) => print(val));

Future.doWhile 重复执行知道返回 false,

Future.forEach 顺序拿到对应的 future(同时执行只是顺序拿值而已):

  Future.forEach([
    Future.delayed(Duration(seconds: 6), () => 12),
    Future.delayed(Duration(seconds: 10), () => 15)
  ], (f) => f.then(print));

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

春风十里

暂无简介

0 文章
0 评论
23 人气
更多

推荐作者

烙印

文章 0 评论 0

singlesman

文章 0 评论 0

独孤求败

文章 0 评论 0

晨钟暮鼓

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文