美文网首页
了解一下dart中的Future

了解一下dart中的Future

作者: 健健可迪仔 | 来源:发表于2020-04-26 21:46 被阅读0次

        在flutter开发中我们大量使用Future,特别是异步编程中,如果一个Fuction被async修饰,则该Fuction将会返回一个Future,Future的运行值即该Fuction的返回值。在调用这种的方法的时候可以以同步方式调用(调用的时候使用await关键字修饰),也可以异步调用(Future.then的方式)的方式进行调用,窃以为Future的引入将面向函数编程的理念提高了很多个量级,那么我们就来了解一下Future的一些常用构造方法以及用法吧:
        Future表示延迟运行的对象,用来表示一个潜在的值返回或错误返回,这个返回值将在未来的某个时刻才可用。Future的调用者可以注册回调,一旦返回值或错误可用,就可以通过回调函数对其进行处理。
        Future可以通过两种方式完成:一种是有值的(“未来成功”),另一种是有错误的(“未来失败”)。调用者可以为每种情况设置回调函数。
        在某些情况下,我们可以将一个Future紧接着另一个Future完成,就是说Future的调用可以使成串的。但是当future在完成时出现错误,而且它没有后续与之串起来的Future,则这个错误消息将会被转发给全局错误处理程序。这种机制确保了错误不会被自动删除,但是,这也意味着开发者应该尽早注册错误处理函数以便Future一旦返回error,error处理程序就会立进行处理。
        在注册回调函数时,通常会同时设置正常返回值的处理函数以及catchError处理函数,每一种函数都将把它们处理结果转发给它们的下一个Future,并进一步处理返回值或error结果,使用串联的Future通常会使代码更容易理解;当然我们还可以将异步代码写成是同步代码的代码的方式(通过async和await关键字),这样可以使代码的结构变得很简单。Future叶可能永远不会执行结束,在这种情况下,回调函数将不会被执行。Future的构造方法说明:

    1、Future(FutureOr<T> computation())

      factory Future(FutureOr<T> computation()) {
        _Future<T> result = new _Future<T>();
        Timer.run(() {
          try {
            result._complete(computation());
          } catch (e, s) {
            _completeWithErrorCallback(result, e, s);
          }
        });
        return result;
      }
    

    创建包含使用Timer.run异步调用计算结果的Future。如果执行过程抛出异常,则future将返回错误。如果返回的值本身也是一个Future,则创建的Future的完成将后继续等待返回的Future执行完成,然后将返回相同类型的结果。如果返回一个非未来值,则返回的Future将使用该值作为返回值。

    2、Future.delayed(Duration duration, [FutureOr<T> computation()])

      factory Future.delayed(Duration duration, [FutureOr<T> computation()]) {
        _Future<T> result = new _Future<T>();
        new Timer(duration, () {
          if (computation == null) {
            result._complete(null);
          } else {
            try {
              result._complete(computation());
            } catch (e, s) {
              _completeWithErrorCallback(result, e, s);
            }
          }
        });
        return result;
      }
    

        创建在延迟一定时间后运行的Future。computation将在给定的时间后执行。如果computation返回的又是一个Future,则此构造函数返回的Future将与该Future的值或错误一起完成后返回。如果持续时间为0或更少,则在所有微任务运行之后运行,它不会在下一个事件循环迭代中运行。如果省略computation,Future将最终使用null值返回。如果调用computation抛出异常,则创建的Futuren将返回错误。

    3、Future.microtask(FutureOr<T> computation())

    factory Future.microtask(FutureOr<T> computation()) {
      _Future<T> result = new _Future<T>();
      scheduleMicrotask(() {
        try {
          result._complete(computation());
        } catch (e, s) {
          _completeWithErrorCallback(result, e, s);
        }
      });
      return result;
    }
    

        创建包含使用scheduleMicrotask异步调用计算的结果的Future。如果执行computation抛出异常,则返回的future将返回错误。如果computation本身又返回一个Future,则创建的Future的完成后将继续等待返回的Future完成,然后将使用相同类型的结果进行返回。如果computation返回一个非future值,则返回的future将使用该值返回。

    4、 Future.value([FutureOr<T> value])

      factory Future.value([FutureOr<T> value]) {
        return new _Future<T>.immediate(value);
      }
    

        创建一个有值返回的Future。如果返回值又是Future,则创建的Future将等待返回的future完成后将相同类型的结果返回。因为一个value future可以在错误的情况下返回,所以future.value创建的future也可以返回。如果value不是Future,则创建的Future将使用value值返回,相当于new Future<T>.sync(()=>value)。

    5、Future.sync(FutureOr<T> computation())

    factory Future.sync(FutureOr<T> computation()) {
      try {
        var result = computation();
        if (result is Future<T>) {
          return result;
        } else {
          return new _Future<T>.value(result);
        }
      } catch (error, stackTrace) {
        var future = new _Future<T>();
        AsyncError replacement = Zone.current.errorCallback(error, stackTrace);
        if (replacement != null) {
          future._asyncCompleteError(
              _nonNullError(replacement.error), replacement.stackTrace);
        } else {
          future._asyncCompleteError(error, stackTrace);
        }
        return future;
      }
    }
    

        返回包含立即调用计算结果的future。如果computation抛出异常,则返回的future将返回错误。如果computation返回Future<T>,则返回该Future。如果computation返回一个非future值,则返回已完成运行的future。

    相关文章

      网友评论

          本文标题:了解一下dart中的Future

          本文链接:https://www.haomeiwen.com/subject/fcygihtx.html